SlideShare una empresa de Scribd logo
1 de 18
SEÑALES: INTERRUPCIONES SOFTWARE
Generalidades.

Durante una sesión cualquiera, el número de procesos depende del trabajo
que los usuarios realicen. Se sabe que los procesos tienen su propio
contexto, pero esto no quiere decir que estén incomunicados entre sí.
Existe un conjunto de métodos mantenidos por el kernel que permiten
entablar diálogos entre ellos. Estos métodos se llaman mecanismos IPC
(Interprocess Comunication). Dentro del conjunto de IPC’s se tienen a los
semáforos, la memoria compartida, colas de mensajes, etc. Estas no son
las únicas formas de intercomunicación de que dispone el sistema
operativo Los procesos también pueden enviarse interrupciones software,
señales. El conjunto de señales lo maneja el gestor de señales. El número
y tipo de señales viene impuesto por el sistema operativo y cada una de
ellas será empleada en un caso concreto siendo su número la única
información que realmente se transmite entre los procesos cuyo significado
dependerá de la interpretación del programador.
SEÑALES Y EXEPCIONES

Cuando un S.O desea notificar a un proceso la ocurrencia de un determinado evento o error, recurre a 2 tipos de
mecanismos: SEÑALES y EXEPCIONES, la primera se utiliza en POSIX y la segunda en WINDOWS NT .
SEÑALES
Las señales tienen frente al proceso el mismo comportamiento que las interrupciones tienen frente al procesador, por
lo que se puede decir que una señal es una interrupción del proceso.
El proceso que recibe una señal se comporta de la siguiente forma:
• El proceso detiene su ejecución en la instrucción de máquina que está ejecutando
• Bifurca a ejecutar una rutina de tratamiento de la señal, cuyo código ha de formar parte del propio proceso
• Una vez ejecutada la rutina de tratamiento, sigue la ejecución del proceso en la instrucción en el que fue
    interrumpido.
El origen de una señal puede ser un proceso o el sistema operativo
SEÑAL PROCESO-PROCESO
Un proceso puede enviar una señal a otro proceso que tenga el mismo identificador de usuario (uid) pero no a los
que lo tengan distinto . Un proceso también puede mandar una señal a un grupo de procesos, que han de tener su
mismo uid

PROGRAMA 03-02

Programa que imprime la información de identificación de un proceso.

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>


void main(void)
{
  printf("Identificador de usuario: %dn", getuid());
  printf("Identificador de usuario efectivo: %dn", geteuid());
  printf("Identificador de grupo: %dn", getgid());
  printf("Identificador de grupo efetivo: %dn", getegid());
}
SEÑAL SISTEMA OPERATIVO-PROCESO

El sistema operativo también toma la decisión de enviar señales a los procesos cuando ocurren
determinados condiciones; Por ej. Las excepciones de ejecución programa( el desbordamiento en las
operaciones aritméticas , la división por cero, el intento de ejecutar una instrucción con código de
operación incorrecto o de direccionar una porción de memoria prohibida), las convierte el S.O en
señales al proceso que ha causado la excepción.

Debido a que existen gran variedad de señales que para indicarle al proceso muchas cosas pj, podemos
categorizar a las señales como:
Excepciones de hardware
Comunicación
E/S asíncrona

EFECTO DE LA SEÑAL Y ARMADA DE LA MISMA

El efecto de la señal es ejecutar una rutina de tratamiento, para que esto sea asi, el proceso debe tener
armada ese tipo de señal, es decir ha de estar preparado para recibir ese tipo de señal.
Armar una señal significa indicar al S.O el nombre de la rutina del proceso que ha de tratar ese tipo de
señal.
COMPORTAMIENTO
         Cuando un proceso recibe una señal, puede tratarla de tres formas diferentes:
  1.-    Ignorar la señal, con lo cual no tiene efecto.
  2.-    Invocar a la rutina de tratamiento correspondiente al número de señal. Esta rutina no la codifica el
         programador, sino que la aporta el kernel y normalmente tiene como fin el terminar el proceso que recibe la
         señal. En algunos casos, antes de eliminar al proceso, el kernel se encarga de generar en el directorio de
         trabajo actual del proceso un fichero llamado core que contiene un volcado de memoria del contexto del
         proceso. Analizando dicho fichero se podrá saber en qué punto terminó el proceso y por qué motivo se le
         envió la señal.
  3.-    Invocar a una rutina que se encarga de tratar la señal y que ha sido creada por el programador. Esta rutina
         establecerá un mecanismo de comunicación entre procesos o modificará el curso normal del programa. En
         estos casos, el proceso no va a terminar a menos que la rutina de tratamiento indique lo contrario.


                               Señal                                            La primera señal que recibe no provoca que
         Señal    Señal                                                         el proceso cambie el curso de su
                                                                                ejecución, esto es debido a que la acción que
                                                                                está activa es que el proceso ignore la señal.
                                                                                El proceso prosigue su ejecución y recibe una
Inicio                                                                 Fin      segunda señal que le fuerza a entrar en una
                                                                                rutina de tratamiento. Esta rutina, después de
                                                                                tratar la señal, puede optar por tres acciones:
                                                       Fin                      restaurar la ejecución del proceso al punto
                                 Tratamiento                                    donde se produjo la interrupción, finalizar el
                                 por defecto                                    proceso o restaurar alguno de los estados
                 Tratamiento                                                    pasados del proceso y continuar la ejecución
                                                     Volcado de                 desde ese punto.
                                                     memoria           Fin      El proceso puede también recibir una señal
                    Fin                                                         que le fuerce a entrar en la rutina de
                                                                                tratamiento por defecto.
SERVIDORES Y DEMONIOS
                                                                 Los servidores y los demonios son dos tipos de procesos
                                                                 muy frecuentes cuyas características son:
                                                                 Un servidor es un proceso que está pendiente de recibir
                                                                 ordenes de trabajo que provienen de otros procesos
                                                                 llamados clientes , una vez recibida la orden, la ejecutan
                                                                 y la responden al peticionario con el resultado.
                                                                 El proceso servidor tiene la siguiente estructura de
                                                                 bucle infinito:
                                                                 1. Lectura de orden. El proceso está bloqueado
                                                                       esperando a que llegue una orden.
                                                                 2. Recibida la orden, el servidor lo ejecuta.
                                                                 3. Finaliza la ejecución, el servidor responde con el
                                                                       resultado al proceso cliente y vuelve al punto No 1

                                                                El proceso servidor tiene abierto un puerto del que lee las
                                                                peticiones, en la solicitud el cliente envía el identificador
                                                                del puerto en el que el servidor debe contestar.
                                                                Un servidor será secuencial cuando no admite una solicitud
                                                                de trabajo hasta que no termine la solicitud de trabajo
                                                                actual.
                                                                Se puede necesitar que el servidor sea paralelo es decir que
                                                                admita varias peticiones y los atienda simultáneamente, y
                                                                para conseguir esto se puede actuar de la siguiente forma:

1.   Lectura del Orden (proceso bloqueado esperando que llegue una orden)
2.   Asignación de un nuevo puerto para el nuevo cliente
3.   Generación de un proceso hijo que realiza el trabajo solicitado por el cliente
4.   Vuelta al punto 1
PROCESO CLIENTE SERVIDOR EN MAQUINAS DISTINTAS




Un proceso demonio es un proceso que tiene las siguientes características:
• Se arranca al iniciar el sistema, puesto que siempre debe estar activo
• No muere, en caso de que un demonio muera por algún imprevisto, es muy recomendable que exista un
   mecanismo que detecte la muerte y lo re arranque
• Los procesos servidores suelen tener el carácter de demonios
SERVICIOS POSIX PARA LA GESTION DE PROCESOS
IDENTIFICACION DE PROCESOS
POSIX identifica cada proceso por medio de un entero único denominado identificador de proceso de tipo pid_t,
y estos servicios son los siguientes:
Pid_t getpid(void)
Identificador del proceso padre pid_t getppid(void)

Programa que imprime el identificador del proceso y el identificador de su proceso padre.

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

void main(void)
{
  pid_t id_proceso;
  pid_t id_padre;

    id_proceso = getpid();
    id_padre = getppid();

    printf("Identificador de proceso: %dn", id_proceso);
    printf("Identificador del proceso padre: %dn", id_padre);
}
SERVICIOS POSIX PARA LA GESTION DE PROCESOS
Cada proceso además lleva asociado un usuario que se denomina propietario, Cada usuario en el sistema tienen un identificador único
denominado identificador de usuario de tipo uid_t. El proceso también tiene un identificador de usuario efectivo, que determina los
privilegios que un proceso tienen cuando se encuentra ejecutando.
El sistema también incluye grupos de usuarios, cada usuario debe ser miembro de al menos un grupo . Al igual que los usuarios cada
proceso lleva asociado el identificador de grupo al que pertenece y el identificador de grupo efectivo, y los servicios que nos permite tener
esta información son:
Obtener el identificador de usuario real
Uid_t getuid(void);
Obtener el identificador de usuario efectivo
uid_t geteuid(void);
Obtener el identificador del grupo real
Gid_t getgid(void);
Obtener el identificador del grupo efectivo
Gid_t getegid(void);

Programa que imprime la información de identificación de un proceso.

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>


void main(void)
{
  printf("Identificador de usuario: %dn", getuid());
  printf("Identificador de usuario efectivo: %dn",          geteuid());
  printf("Identificador de grupo: %dn", getgid());
  printf("Identificador de grupo efetivo: %dn", getegid());
}
SERVICIOS POSIX PARA LA GESTION DE PROCESOS
                                            ENTORNO DE UN PROCESO
 El entorno de un proceso viene definido por una lista de variables que se pasan al mismo en el momento de comenzar su ejecución, estas
 variables se llaman variables de entorno y son accesibls a un proceso a través de la variable externa environ, declarada de la siguiente forma:
 1 extern char ** environ;
 Esta variable apunta a una lista de variables de entorno. Esta lista no es mas que un vector de punteros a cadenas de caracteres de la forma
 nombre=valor, donde nombre hace referencia al nombre de una variable de entorno y el valor al contenido de la misma.
 Programa que imprime el entorno del proceso.
 #include <stdio.h>
 #include <stdlib.h>                                                    Cada aplicación interpreta la lista de variables de entorno de forma
                                                                        específica POSIX establece el significado de determinadas variables de
 extern char **environ;                                                 entorno. Las mas comunes son:
                                                                        •   HOME direct. Trabajo inicial del usuario
 void main(int argc, char **argv)                                       •   LOGNAME: nombre del usuario asociado a un proceso
 {                                                                      •   PATH: prefijo de directorios para encontrar ejecutables
   int i;                                                               •   TERM: tipo de terminal
                                                                        •   TZ: información de la zona horaria
   printf("Lista de variables de entorno de %sn",argv[0]);
                                                                      Programa que imprime el valor de la variable HOME.
   for (i=0 ; environ[i] != NULL ; i++)
     printf("environ[%d] = %sn", i, environ[i]);                     #include <stdio.h>
 }                                                                    #include <stdlib.h>

OBTENER EL VALOR DE UNA VARIABLE DE                                   void main(void)
ENTORNO                                                               {
El servicio getenv permite buscar una variable de entorno               char *home = NULL;
su sintaxis es: char *getenv(const char *name);
Esta función devuelve un puntero al valor asociado a la variable de       home = getenv("HOME");
entorno de nombre name.                                                   if (home == NULL)
Si la variable de entorno no se encuentra definida, la función               printf("$HOME no se encuentra definidan");
devuelve NULL                                                             else
                                                                             printf("El valor de $HOME es %sn", home);
                                                                      }
CREACIÓN DE UN PROCESO

En una interfaz POSIX la forma de crear un proceso es invocando el servicio fork. El S.O trata este servicio realizando
una clonación del proceso que lo solicite, constituyendo la relación con el nuevo proceso padre-hijo.
Su prototipo es: pid_t fork();




La creación del proceso se realiza copiando la imagen de memoria y el BCP, definiendo que el proceso hijo es una
copia del proceso padre en el instante en que este solicita el servicio fork(). Significa que los datos y la pila del
proceso hijo son los que tiene el proceso padre en ese instante de ejecución. Es mas dado que al entrar el S.O a tratar
el servicio, lo primero que hace es salvar los registros del BCP padre, al copiarse el BCP se copian los valores salvados
de los registros , por lo que el hijo tiene los mismos valores que el padre.
TALLERES PARA GRUPOS DE TRABAJO


1. SINCRONIZACION DE PROCESOS
    1. PROBLEMA DE LA SECCION CRITICA: SEMAFOROS           GRUPO No 3
2. PROBLEMAS CLASICOS DE SINCRONIZACION
    1. BUFFER LIMITADO                                     GRUPO No 2
    2. LECTORES Y ESCRITORES
    3. FILOSOFOS COMENSALES
3. REGIONES CRITICAS
    1. MONITORES                                           GRUPO No 1
4. BLOQUEOS MUTUOS: MODELO DEL SISTEMA
    1. ESTRATEGIAS COMBINADAS PARA LOS BLOQUEOS MUTUOS     GRUPO No 4
CREACIÓN DE UN PROCESO

Todo esto significa que el contador de programa de los 2 procesos tienen el mismo valor, por lo que van a ejecutar la
misma instrucción de máquina, No conceptualizar que el proceso hijo empieza la ejecución del código en su punto de
inicio, repetimos que el hijo empieza a ejecutar al igual que el padre en la sentencia que está después del fork()
El proceso hijo no es totalmente idéntico al padre, algunos valores de su BCP han de ser distintos y estos son:
1. El Ph tiene su propio identificador de proceso
2. El Ph tiene una nueva descripción de memoria, aunque tenga los mismos segmentos con el mismo contenido, no
      tienen porque estar en la misma zona de memoria (especialmente en sistemas con memoria virtual)
3. El tiempo de ejecución del proceso hijo es igual a 0
4. El valor que retorna el S.O como resultado del fork es distinto en el hijo y el padre (hijo recibo 0 y el padre recibe
      el identificador del proceso hijo)
5. Todas las alarmas pendientes se desactivan en el proceso hijo.
CREACIÓN DE UN PROCESO

Programa que crea un proceso.
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

void main(void)
{
  pid_t pid;

    pid = fork();
    switch(pid)
    {
      case -1: /* error del fork() */
        perror("fork");
        break;
      case 0: /* proceso hijo */
        printf("Proceso %d; padre = %d n", getpid(), getppid());
        break;
      default: /* padre */
        printf("Proceso %d; padre = %d n", getpid(), getppid());
    }
}
CREACIÓN DE UN PROCESO

        Programa que crea la cadena de procesos
        #include <sys/types.h>
        #include <stdio.h>
        #include <unistd.h>
                                                                                     1

        void main(void)
        {                                                                            2
          pid_t pid;
          int i;
          int n = 10;

            for (i = 0; i < n; i++)                                                   3
            {
              pid = fork();
              if (pid != 0)
                 break;
            }
            printf("El padre del proceso %d es %dn", getpid(), getppid());           N
        }



Encada ejecución del bucle se crea un proceso. El proceso padre obtiene el identificador del proceso hijo, que será
distinto de 0 y saldrá del bucle utilizando break. El proceso hijo continuará la ejecución, repitiéndose este proceso
hasta que llegue al final del bucle.
CREACIÓN DE UN PROCESO

       PROGRAMA 03-07

       Programa que crea la estructura de procesos.                                 1
       #include <stdio.h>
       #include <sys/types.h>
       #include <unistd.h>

       void main(void)                                                       2          3                   N
       {
         pid_t pid;
         int i;
         int n = 10;

           for (i = 0; i < n; i++)
           {
             pid = fork();
             if (pid == 0)
                break;
           }
           printf("El padre del proceso %d es %dn", getpid(), getppid());
       }



En este programa, es el proceso hijo el que finaliza la ejecución del bucle ejecutando la sentencia break, siendo
el padre encargado de crear todos los procesos
SERVICIOS POSIX EXEC
Este servicio tiene como objetivo cambiar el programa que está ejecutando un proceso. Y se puede decir que tiene 2
fases:
En la primera se vacía el proceso de casi todo su contenido,
En la segunda se carga en nuevo programa




                                                                                       En la fase de vaciado se conservan
                                                                                       algunas informaciones como:
                                                                                       • Entorno del proceso Que el S.O
                                                                                          incluye en la nueva pila del
                                                                                          proceso.
                                                                                       • Algunas informaciones del BCP
                                                                                          como         Identificador        del
                                                                                          proceso, del proceso padre, del
                                                                                          usuario y descriptores de archivos
                                                                                          abiertos
                                                                                       En la fase de carga hay que realizar
                                                                                       las siguientes operaciones:
                                                                                       • Asignar el proceso un nuevo
                                                                                          espacio de memoria.
                                                                                       • Cargar el texto y datos iniciales en
                                                                                          los segmentos correspondientes
                                                                                       • Crear la pila inicial del proceso con
                                                                                          el entorno y los parámetros que
Recuerde que el servicio fork crea un nuevo proceso que ejecuta el mismo                  se pasan
programa que el proceso padre y el servicio exec no crea un nuevo proceso sino         • Rellenar el BCP con los valores
                                                                                          iniciales de los registros y la
que permite que un proceso pase a ejecutar un programa distinto                           descripción de los nuevos
                                                                                          segmentos de memoria
SERVICIOS POSIX EXEC
                                                              La familia de funciones exec remplaza la imagen del
                                                              proceso actual por una nueva imagen. Esta nueva
                                                              imagen se construye a partir de un archivo ejecutable. Si
                                                              la llamada se ejecuta con éxito, ésta no devolverá
                                                              ningún valor puesto que la imagen del proceso habrá
                                                              sido remplazada, caso contrario devuelve –1.
                                                              La función main() del nuevo programa tendrá la forma:
                                                              int main(int argc, char **argv)
// Ejemplo: Programa que ejecuta el comando ls –l
#include <sys/types.h>
#include <sys/wait.h>                                 // Ejemplo: Programa que ejecuta el comando ls –l mediante execvp
#include <stdio.h>                                    #include <sys/types.h>
#include <unistd.h>                                   #include <stdio.h>
int main()                                            #include <unistd.h>
{                                                     int main(int argc, char **argv)
  pid_t pid;                                          {
  int status;                                            pid_t pid;
  pid = fork();                                          char *argumentos[3];
  switch(pid)                                            argumentos[0] = "ls";
    {                                                    argumentos[1] = "-l";
      case -1: /* error del fork() */                    argumentos[2] = NULL;
                  exit(-1);                              pid = fork();
      case 0: /* proceso hijo */                         switch(pid)
                  execlp("ls","ls","-l",NULL);           {
                  perror("exec");                              case -1: /* error del fork() */
                  break;                                          exit(-1);
      default: /* padre */                                     case 0: /* proceso hijo */
                  printf("Proceso padren");                      execvp(argumentos[0], argumentos);
                  while(pid != wait(&status));                     perror("exec");
   }                                                               break;
}                                                              default: /* padre */
                                                                  printf("Proceso padren");
                                                        }
                                                      }

Más contenido relacionado

La actualidad más candente

IDR Unidad 4: Validación y gestión de requisitos
IDR Unidad 4: Validación y gestión de requisitosIDR Unidad 4: Validación y gestión de requisitos
IDR Unidad 4: Validación y gestión de requisitosFranklin Parrales Bravo
 
Diagramas UML: Componentes y despliegue
Diagramas UML: Componentes y despliegueDiagramas UML: Componentes y despliegue
Diagramas UML: Componentes y desplieguejoshell
 
Servicio de Nombramiento
Servicio de NombramientoServicio de Nombramiento
Servicio de NombramientoJorge Guerra
 
Administración de procesos en el S.O.
Administración de procesos en el S.O.Administración de procesos en el S.O.
Administración de procesos en el S.O.Carlos Solano
 
Metodología de desarrollo de software basada en componentes
Metodología de desarrollo de software basada en componentesMetodología de desarrollo de software basada en componentes
Metodología de desarrollo de software basada en componentesEmmanuel Fontán
 
Técnicas y herramientas para el desarrollo de Software
Técnicas y herramientas para el desarrollo de SoftwareTécnicas y herramientas para el desarrollo de Software
Técnicas y herramientas para el desarrollo de SoftwareOcma' Xdd
 
Arquitectura e implementación de PostgreSQL 9.3
Arquitectura e implementación de PostgreSQL 9.3Arquitectura e implementación de PostgreSQL 9.3
Arquitectura e implementación de PostgreSQL 9.3Bryan Rodríguez
 
Comandos básicos para bases de datos mysql y workbench
Comandos básicos para bases de datos mysql y workbenchComandos básicos para bases de datos mysql y workbench
Comandos básicos para bases de datos mysql y workbenchRobedgar MX
 
Estructura unix
Estructura unixEstructura unix
Estructura unixCalP
 
Análisis de requerimientos
Análisis de requerimientosAnálisis de requerimientos
Análisis de requerimientosGustavo Araque
 

La actualidad más candente (20)

Semaforos
SemaforosSemaforos
Semaforos
 
IDR Unidad 4: Validación y gestión de requisitos
IDR Unidad 4: Validación y gestión de requisitosIDR Unidad 4: Validación y gestión de requisitos
IDR Unidad 4: Validación y gestión de requisitos
 
Diagramas UML: Componentes y despliegue
Diagramas UML: Componentes y despliegueDiagramas UML: Componentes y despliegue
Diagramas UML: Componentes y despliegue
 
Servicio de Nombramiento
Servicio de NombramientoServicio de Nombramiento
Servicio de Nombramiento
 
Administración de procesos en el S.O.
Administración de procesos en el S.O.Administración de procesos en el S.O.
Administración de procesos en el S.O.
 
Metodología de desarrollo de software basada en componentes
Metodología de desarrollo de software basada en componentesMetodología de desarrollo de software basada en componentes
Metodología de desarrollo de software basada en componentes
 
2.3 procesos ligeros
2.3 procesos ligeros2.3 procesos ligeros
2.3 procesos ligeros
 
Técnicas y herramientas para el desarrollo de Software
Técnicas y herramientas para el desarrollo de SoftwareTécnicas y herramientas para el desarrollo de Software
Técnicas y herramientas para el desarrollo de Software
 
Estándares para el Modelado de Procesos de Negocios
Estándares para el Modelado de Procesos de NegociosEstándares para el Modelado de Procesos de Negocios
Estándares para el Modelado de Procesos de Negocios
 
Arquitectura e implementación de PostgreSQL 9.3
Arquitectura e implementación de PostgreSQL 9.3Arquitectura e implementación de PostgreSQL 9.3
Arquitectura e implementación de PostgreSQL 9.3
 
Comandos básicos para bases de datos mysql y workbench
Comandos básicos para bases de datos mysql y workbenchComandos básicos para bases de datos mysql y workbench
Comandos básicos para bases de datos mysql y workbench
 
6 Curso de POO en Java - clases y objetos
6  Curso de POO en Java - clases y objetos6  Curso de POO en Java - clases y objetos
6 Curso de POO en Java - clases y objetos
 
Abd procesamiento consultas
Abd procesamiento consultasAbd procesamiento consultas
Abd procesamiento consultas
 
Modelo 4+1
Modelo 4+1Modelo 4+1
Modelo 4+1
 
Estructura unix
Estructura unixEstructura unix
Estructura unix
 
Elicitación de requerimientos
Elicitación de requerimientosElicitación de requerimientos
Elicitación de requerimientos
 
Metodologia kendall y Kendall
Metodologia kendall y KendallMetodologia kendall y Kendall
Metodologia kendall y Kendall
 
Gestion de memoria en unix y solaris
Gestion de memoria en unix y solarisGestion de memoria en unix y solaris
Gestion de memoria en unix y solaris
 
Análisis de requerimientos
Análisis de requerimientosAnálisis de requerimientos
Análisis de requerimientos
 
Requisitos no Funcionales
Requisitos no FuncionalesRequisitos no Funcionales
Requisitos no Funcionales
 

Destacado (19)

Herencia
HerenciaHerencia
Herencia
 
Gestion de memoria
Gestion de memoriaGestion de memoria
Gestion de memoria
 
P1
P1P1
P1
 
Memoria dinamica
Memoria dinamicaMemoria dinamica
Memoria dinamica
 
Basededatosicompleto 091122141836-phpapp02
Basededatosicompleto 091122141836-phpapp02Basededatosicompleto 091122141836-phpapp02
Basededatosicompleto 091122141836-phpapp02
 
07 funciones
07 funciones07 funciones
07 funciones
 
Macros
MacrosMacros
Macros
 
2do parcial c
2do parcial c2do parcial c
2do parcial c
 
Variables, constantes y tipos de datos en C
Variables, constantes y tipos de datos en CVariables, constantes y tipos de datos en C
Variables, constantes y tipos de datos en C
 
Funciones recursivas
Funciones recursivasFunciones recursivas
Funciones recursivas
 
Estructuras en c++
Estructuras en c++Estructuras en c++
Estructuras en c++
 
Memoria dinamica
Memoria dinamicaMemoria dinamica
Memoria dinamica
 
Estructuras en c++
Estructuras en c++Estructuras en c++
Estructuras en c++
 
Punteros y funciones abril agosto 2016
Punteros y funciones abril agosto 2016Punteros y funciones abril agosto 2016
Punteros y funciones abril agosto 2016
 
Punteros presentacion
Punteros presentacionPunteros presentacion
Punteros presentacion
 
Material estudio c
Material estudio cMaterial estudio c
Material estudio c
 
Tipos de datos en programacion
Tipos de datos en programacionTipos de datos en programacion
Tipos de datos en programacion
 
Resumen de los 7 hábitos de la gente altamente efectiv
Resumen de los 7 hábitos de la gente altamente efectivResumen de los 7 hábitos de la gente altamente efectiv
Resumen de los 7 hábitos de la gente altamente efectiv
 
Tipos De Datos
Tipos De DatosTipos De Datos
Tipos De Datos
 

Similar a Señales posix

Similar a Señales posix (20)

RPC - LLAMADAS REMOTAS
RPC - LLAMADAS REMOTASRPC - LLAMADAS REMOTAS
RPC - LLAMADAS REMOTAS
 
s.o.
s.o.s.o.
s.o.
 
Expocontrolcalidad
ExpocontrolcalidadExpocontrolcalidad
Expocontrolcalidad
 
So 2
So 2So 2
So 2
 
UNIDAD II SISTEMAS OPERATIVOS
UNIDAD II SISTEMAS OPERATIVOSUNIDAD II SISTEMAS OPERATIVOS
UNIDAD II SISTEMAS OPERATIVOS
 
(2) Arquitectura del SO (generalidades).pdf
(2) Arquitectura del SO (generalidades).pdf(2) Arquitectura del SO (generalidades).pdf
(2) Arquitectura del SO (generalidades).pdf
 
Descripcion y control de procesos
Descripcion y control de procesosDescripcion y control de procesos
Descripcion y control de procesos
 
U n i d a d 2 sist oper
U n i d a d    2 sist operU n i d a d    2 sist oper
U n i d a d 2 sist oper
 
Capitulo 4 grupo 4
Capitulo 4 grupo 4Capitulo 4 grupo 4
Capitulo 4 grupo 4
 
Modelo de estados y transiciones
Modelo de estados y transicionesModelo de estados y transiciones
Modelo de estados y transiciones
 
S..O. Unidad 2
S..O. Unidad 2S..O. Unidad 2
S..O. Unidad 2
 
gestion de procesos
gestion de procesosgestion de procesos
gestion de procesos
 
Tarea3 fernando lopez
Tarea3   fernando lopezTarea3   fernando lopez
Tarea3 fernando lopez
 
Tarea3 fernando lopez
Tarea3   fernando lopezTarea3   fernando lopez
Tarea3 fernando lopez
 
Unidad2
Unidad2Unidad2
Unidad2
 
Tolerancia A Fallos
Tolerancia A FallosTolerancia A Fallos
Tolerancia A Fallos
 
Administrador de procesos
Administrador de procesosAdministrador de procesos
Administrador de procesos
 
So 2da unidad
So 2da unidadSo 2da unidad
So 2da unidad
 
Sistemas operativos informe
Sistemas operativos informe Sistemas operativos informe
Sistemas operativos informe
 
Sistemas Operativos
Sistemas Operativos Sistemas Operativos
Sistemas Operativos
 

Más de Cesar Oswaldo Osorio Agualongo (18)

Aprendizaje de Lenguaje de Programación Python
Aprendizaje de Lenguaje de Programación PythonAprendizaje de Lenguaje de Programación Python
Aprendizaje de Lenguaje de Programación Python
 
Notas 2 do parcial
Notas 2 do parcialNotas 2 do parcial
Notas 2 do parcial
 
Repaso excel
Repaso excelRepaso excel
Repaso excel
 
Notas 2490
Notas 2490Notas 2490
Notas 2490
 
Notas 2625
Notas 2625Notas 2625
Notas 2625
 
Material iii parcial
Material iii parcialMaterial iii parcial
Material iii parcial
 
Unidad 2 curso c
Unidad 2 curso cUnidad 2 curso c
Unidad 2 curso c
 
Parte i curso c
Parte i curso cParte i curso c
Parte i curso c
 
Punteros y funciones
Punteros y funciones Punteros y funciones
Punteros y funciones
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Practica 6 manejo de archivos v1
Practica 6 manejo de archivos v1Practica 6 manejo de archivos v1
Practica 6 manejo de archivos v1
 
Programacion semanal programacion i
Programacion semanal programacion iProgramacion semanal programacion i
Programacion semanal programacion i
 
Silabo programacion i abril2016 agosto2016
Silabo programacion i abril2016 agosto2016Silabo programacion i abril2016 agosto2016
Silabo programacion i abril2016 agosto2016
 
Gestion de archivos
Gestion de archivosGestion de archivos
Gestion de archivos
 
Definiciones lideres evaluado
Definiciones lideres evaluadoDefiniciones lideres evaluado
Definiciones lideres evaluado
 
Formato de proyecto
Formato de proyectoFormato de proyecto
Formato de proyecto
 
Carteles
CartelesCarteles
Carteles
 
42705734 manual-basico-de-uso-project-2010
42705734 manual-basico-de-uso-project-201042705734 manual-basico-de-uso-project-2010
42705734 manual-basico-de-uso-project-2010
 

Señales posix

  • 1. SEÑALES: INTERRUPCIONES SOFTWARE Generalidades. Durante una sesión cualquiera, el número de procesos depende del trabajo que los usuarios realicen. Se sabe que los procesos tienen su propio contexto, pero esto no quiere decir que estén incomunicados entre sí. Existe un conjunto de métodos mantenidos por el kernel que permiten entablar diálogos entre ellos. Estos métodos se llaman mecanismos IPC (Interprocess Comunication). Dentro del conjunto de IPC’s se tienen a los semáforos, la memoria compartida, colas de mensajes, etc. Estas no son las únicas formas de intercomunicación de que dispone el sistema operativo Los procesos también pueden enviarse interrupciones software, señales. El conjunto de señales lo maneja el gestor de señales. El número y tipo de señales viene impuesto por el sistema operativo y cada una de ellas será empleada en un caso concreto siendo su número la única información que realmente se transmite entre los procesos cuyo significado dependerá de la interpretación del programador.
  • 2. SEÑALES Y EXEPCIONES Cuando un S.O desea notificar a un proceso la ocurrencia de un determinado evento o error, recurre a 2 tipos de mecanismos: SEÑALES y EXEPCIONES, la primera se utiliza en POSIX y la segunda en WINDOWS NT . SEÑALES Las señales tienen frente al proceso el mismo comportamiento que las interrupciones tienen frente al procesador, por lo que se puede decir que una señal es una interrupción del proceso. El proceso que recibe una señal se comporta de la siguiente forma: • El proceso detiene su ejecución en la instrucción de máquina que está ejecutando • Bifurca a ejecutar una rutina de tratamiento de la señal, cuyo código ha de formar parte del propio proceso • Una vez ejecutada la rutina de tratamiento, sigue la ejecución del proceso en la instrucción en el que fue interrumpido. El origen de una señal puede ser un proceso o el sistema operativo
  • 3. SEÑAL PROCESO-PROCESO Un proceso puede enviar una señal a otro proceso que tenga el mismo identificador de usuario (uid) pero no a los que lo tengan distinto . Un proceso también puede mandar una señal a un grupo de procesos, que han de tener su mismo uid PROGRAMA 03-02 Programa que imprime la información de identificación de un proceso. #include <sys/types.h> #include <stdio.h> #include <unistd.h> void main(void) { printf("Identificador de usuario: %dn", getuid()); printf("Identificador de usuario efectivo: %dn", geteuid()); printf("Identificador de grupo: %dn", getgid()); printf("Identificador de grupo efetivo: %dn", getegid()); }
  • 4. SEÑAL SISTEMA OPERATIVO-PROCESO El sistema operativo también toma la decisión de enviar señales a los procesos cuando ocurren determinados condiciones; Por ej. Las excepciones de ejecución programa( el desbordamiento en las operaciones aritméticas , la división por cero, el intento de ejecutar una instrucción con código de operación incorrecto o de direccionar una porción de memoria prohibida), las convierte el S.O en señales al proceso que ha causado la excepción. Debido a que existen gran variedad de señales que para indicarle al proceso muchas cosas pj, podemos categorizar a las señales como: Excepciones de hardware Comunicación E/S asíncrona EFECTO DE LA SEÑAL Y ARMADA DE LA MISMA El efecto de la señal es ejecutar una rutina de tratamiento, para que esto sea asi, el proceso debe tener armada ese tipo de señal, es decir ha de estar preparado para recibir ese tipo de señal. Armar una señal significa indicar al S.O el nombre de la rutina del proceso que ha de tratar ese tipo de señal.
  • 5. COMPORTAMIENTO Cuando un proceso recibe una señal, puede tratarla de tres formas diferentes: 1.- Ignorar la señal, con lo cual no tiene efecto. 2.- Invocar a la rutina de tratamiento correspondiente al número de señal. Esta rutina no la codifica el programador, sino que la aporta el kernel y normalmente tiene como fin el terminar el proceso que recibe la señal. En algunos casos, antes de eliminar al proceso, el kernel se encarga de generar en el directorio de trabajo actual del proceso un fichero llamado core que contiene un volcado de memoria del contexto del proceso. Analizando dicho fichero se podrá saber en qué punto terminó el proceso y por qué motivo se le envió la señal. 3.- Invocar a una rutina que se encarga de tratar la señal y que ha sido creada por el programador. Esta rutina establecerá un mecanismo de comunicación entre procesos o modificará el curso normal del programa. En estos casos, el proceso no va a terminar a menos que la rutina de tratamiento indique lo contrario. Señal La primera señal que recibe no provoca que Señal Señal el proceso cambie el curso de su ejecución, esto es debido a que la acción que está activa es que el proceso ignore la señal. El proceso prosigue su ejecución y recibe una Inicio Fin segunda señal que le fuerza a entrar en una rutina de tratamiento. Esta rutina, después de tratar la señal, puede optar por tres acciones: Fin restaurar la ejecución del proceso al punto Tratamiento donde se produjo la interrupción, finalizar el por defecto proceso o restaurar alguno de los estados Tratamiento pasados del proceso y continuar la ejecución Volcado de desde ese punto. memoria Fin El proceso puede también recibir una señal Fin que le fuerce a entrar en la rutina de tratamiento por defecto.
  • 6. SERVIDORES Y DEMONIOS Los servidores y los demonios son dos tipos de procesos muy frecuentes cuyas características son: Un servidor es un proceso que está pendiente de recibir ordenes de trabajo que provienen de otros procesos llamados clientes , una vez recibida la orden, la ejecutan y la responden al peticionario con el resultado. El proceso servidor tiene la siguiente estructura de bucle infinito: 1. Lectura de orden. El proceso está bloqueado esperando a que llegue una orden. 2. Recibida la orden, el servidor lo ejecuta. 3. Finaliza la ejecución, el servidor responde con el resultado al proceso cliente y vuelve al punto No 1 El proceso servidor tiene abierto un puerto del que lee las peticiones, en la solicitud el cliente envía el identificador del puerto en el que el servidor debe contestar. Un servidor será secuencial cuando no admite una solicitud de trabajo hasta que no termine la solicitud de trabajo actual. Se puede necesitar que el servidor sea paralelo es decir que admita varias peticiones y los atienda simultáneamente, y para conseguir esto se puede actuar de la siguiente forma: 1. Lectura del Orden (proceso bloqueado esperando que llegue una orden) 2. Asignación de un nuevo puerto para el nuevo cliente 3. Generación de un proceso hijo que realiza el trabajo solicitado por el cliente 4. Vuelta al punto 1
  • 7. PROCESO CLIENTE SERVIDOR EN MAQUINAS DISTINTAS Un proceso demonio es un proceso que tiene las siguientes características: • Se arranca al iniciar el sistema, puesto que siempre debe estar activo • No muere, en caso de que un demonio muera por algún imprevisto, es muy recomendable que exista un mecanismo que detecte la muerte y lo re arranque • Los procesos servidores suelen tener el carácter de demonios
  • 8. SERVICIOS POSIX PARA LA GESTION DE PROCESOS IDENTIFICACION DE PROCESOS POSIX identifica cada proceso por medio de un entero único denominado identificador de proceso de tipo pid_t, y estos servicios son los siguientes: Pid_t getpid(void) Identificador del proceso padre pid_t getppid(void) Programa que imprime el identificador del proceso y el identificador de su proceso padre. #include <sys/types.h> #include <stdio.h> #include <unistd.h> void main(void) { pid_t id_proceso; pid_t id_padre; id_proceso = getpid(); id_padre = getppid(); printf("Identificador de proceso: %dn", id_proceso); printf("Identificador del proceso padre: %dn", id_padre); }
  • 9. SERVICIOS POSIX PARA LA GESTION DE PROCESOS Cada proceso además lleva asociado un usuario que se denomina propietario, Cada usuario en el sistema tienen un identificador único denominado identificador de usuario de tipo uid_t. El proceso también tiene un identificador de usuario efectivo, que determina los privilegios que un proceso tienen cuando se encuentra ejecutando. El sistema también incluye grupos de usuarios, cada usuario debe ser miembro de al menos un grupo . Al igual que los usuarios cada proceso lleva asociado el identificador de grupo al que pertenece y el identificador de grupo efectivo, y los servicios que nos permite tener esta información son: Obtener el identificador de usuario real Uid_t getuid(void); Obtener el identificador de usuario efectivo uid_t geteuid(void); Obtener el identificador del grupo real Gid_t getgid(void); Obtener el identificador del grupo efectivo Gid_t getegid(void); Programa que imprime la información de identificación de un proceso. #include <sys/types.h> #include <stdio.h> #include <unistd.h> void main(void) { printf("Identificador de usuario: %dn", getuid()); printf("Identificador de usuario efectivo: %dn", geteuid()); printf("Identificador de grupo: %dn", getgid()); printf("Identificador de grupo efetivo: %dn", getegid()); }
  • 10. SERVICIOS POSIX PARA LA GESTION DE PROCESOS ENTORNO DE UN PROCESO El entorno de un proceso viene definido por una lista de variables que se pasan al mismo en el momento de comenzar su ejecución, estas variables se llaman variables de entorno y son accesibls a un proceso a través de la variable externa environ, declarada de la siguiente forma: 1 extern char ** environ; Esta variable apunta a una lista de variables de entorno. Esta lista no es mas que un vector de punteros a cadenas de caracteres de la forma nombre=valor, donde nombre hace referencia al nombre de una variable de entorno y el valor al contenido de la misma. Programa que imprime el entorno del proceso. #include <stdio.h> #include <stdlib.h> Cada aplicación interpreta la lista de variables de entorno de forma específica POSIX establece el significado de determinadas variables de extern char **environ; entorno. Las mas comunes son: • HOME direct. Trabajo inicial del usuario void main(int argc, char **argv) • LOGNAME: nombre del usuario asociado a un proceso { • PATH: prefijo de directorios para encontrar ejecutables int i; • TERM: tipo de terminal • TZ: información de la zona horaria printf("Lista de variables de entorno de %sn",argv[0]); Programa que imprime el valor de la variable HOME. for (i=0 ; environ[i] != NULL ; i++) printf("environ[%d] = %sn", i, environ[i]); #include <stdio.h> } #include <stdlib.h> OBTENER EL VALOR DE UNA VARIABLE DE void main(void) ENTORNO { El servicio getenv permite buscar una variable de entorno char *home = NULL; su sintaxis es: char *getenv(const char *name); Esta función devuelve un puntero al valor asociado a la variable de home = getenv("HOME"); entorno de nombre name. if (home == NULL) Si la variable de entorno no se encuentra definida, la función printf("$HOME no se encuentra definidan"); devuelve NULL else printf("El valor de $HOME es %sn", home); }
  • 11. CREACIÓN DE UN PROCESO En una interfaz POSIX la forma de crear un proceso es invocando el servicio fork. El S.O trata este servicio realizando una clonación del proceso que lo solicite, constituyendo la relación con el nuevo proceso padre-hijo. Su prototipo es: pid_t fork(); La creación del proceso se realiza copiando la imagen de memoria y el BCP, definiendo que el proceso hijo es una copia del proceso padre en el instante en que este solicita el servicio fork(). Significa que los datos y la pila del proceso hijo son los que tiene el proceso padre en ese instante de ejecución. Es mas dado que al entrar el S.O a tratar el servicio, lo primero que hace es salvar los registros del BCP padre, al copiarse el BCP se copian los valores salvados de los registros , por lo que el hijo tiene los mismos valores que el padre.
  • 12. TALLERES PARA GRUPOS DE TRABAJO 1. SINCRONIZACION DE PROCESOS 1. PROBLEMA DE LA SECCION CRITICA: SEMAFOROS GRUPO No 3 2. PROBLEMAS CLASICOS DE SINCRONIZACION 1. BUFFER LIMITADO GRUPO No 2 2. LECTORES Y ESCRITORES 3. FILOSOFOS COMENSALES 3. REGIONES CRITICAS 1. MONITORES GRUPO No 1 4. BLOQUEOS MUTUOS: MODELO DEL SISTEMA 1. ESTRATEGIAS COMBINADAS PARA LOS BLOQUEOS MUTUOS GRUPO No 4
  • 13. CREACIÓN DE UN PROCESO Todo esto significa que el contador de programa de los 2 procesos tienen el mismo valor, por lo que van a ejecutar la misma instrucción de máquina, No conceptualizar que el proceso hijo empieza la ejecución del código en su punto de inicio, repetimos que el hijo empieza a ejecutar al igual que el padre en la sentencia que está después del fork() El proceso hijo no es totalmente idéntico al padre, algunos valores de su BCP han de ser distintos y estos son: 1. El Ph tiene su propio identificador de proceso 2. El Ph tiene una nueva descripción de memoria, aunque tenga los mismos segmentos con el mismo contenido, no tienen porque estar en la misma zona de memoria (especialmente en sistemas con memoria virtual) 3. El tiempo de ejecución del proceso hijo es igual a 0 4. El valor que retorna el S.O como resultado del fork es distinto en el hijo y el padre (hijo recibo 0 y el padre recibe el identificador del proceso hijo) 5. Todas las alarmas pendientes se desactivan en el proceso hijo.
  • 14. CREACIÓN DE UN PROCESO Programa que crea un proceso. #include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> void main(void) { pid_t pid; pid = fork(); switch(pid) { case -1: /* error del fork() */ perror("fork"); break; case 0: /* proceso hijo */ printf("Proceso %d; padre = %d n", getpid(), getppid()); break; default: /* padre */ printf("Proceso %d; padre = %d n", getpid(), getppid()); } }
  • 15. CREACIÓN DE UN PROCESO Programa que crea la cadena de procesos #include <sys/types.h> #include <stdio.h> #include <unistd.h> 1 void main(void) { 2 pid_t pid; int i; int n = 10; for (i = 0; i < n; i++) 3 { pid = fork(); if (pid != 0) break; } printf("El padre del proceso %d es %dn", getpid(), getppid()); N } Encada ejecución del bucle se crea un proceso. El proceso padre obtiene el identificador del proceso hijo, que será distinto de 0 y saldrá del bucle utilizando break. El proceso hijo continuará la ejecución, repitiéndose este proceso hasta que llegue al final del bucle.
  • 16. CREACIÓN DE UN PROCESO PROGRAMA 03-07 Programa que crea la estructura de procesos. 1 #include <stdio.h> #include <sys/types.h> #include <unistd.h> void main(void) 2 3 N { pid_t pid; int i; int n = 10; for (i = 0; i < n; i++) { pid = fork(); if (pid == 0) break; } printf("El padre del proceso %d es %dn", getpid(), getppid()); } En este programa, es el proceso hijo el que finaliza la ejecución del bucle ejecutando la sentencia break, siendo el padre encargado de crear todos los procesos
  • 17. SERVICIOS POSIX EXEC Este servicio tiene como objetivo cambiar el programa que está ejecutando un proceso. Y se puede decir que tiene 2 fases: En la primera se vacía el proceso de casi todo su contenido, En la segunda se carga en nuevo programa En la fase de vaciado se conservan algunas informaciones como: • Entorno del proceso Que el S.O incluye en la nueva pila del proceso. • Algunas informaciones del BCP como Identificador del proceso, del proceso padre, del usuario y descriptores de archivos abiertos En la fase de carga hay que realizar las siguientes operaciones: • Asignar el proceso un nuevo espacio de memoria. • Cargar el texto y datos iniciales en los segmentos correspondientes • Crear la pila inicial del proceso con el entorno y los parámetros que Recuerde que el servicio fork crea un nuevo proceso que ejecuta el mismo se pasan programa que el proceso padre y el servicio exec no crea un nuevo proceso sino • Rellenar el BCP con los valores iniciales de los registros y la que permite que un proceso pase a ejecutar un programa distinto descripción de los nuevos segmentos de memoria
  • 18. SERVICIOS POSIX EXEC La familia de funciones exec remplaza la imagen del proceso actual por una nueva imagen. Esta nueva imagen se construye a partir de un archivo ejecutable. Si la llamada se ejecuta con éxito, ésta no devolverá ningún valor puesto que la imagen del proceso habrá sido remplazada, caso contrario devuelve –1. La función main() del nuevo programa tendrá la forma: int main(int argc, char **argv) // Ejemplo: Programa que ejecuta el comando ls –l #include <sys/types.h> #include <sys/wait.h> // Ejemplo: Programa que ejecuta el comando ls –l mediante execvp #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdio.h> int main() #include <unistd.h> { int main(int argc, char **argv) pid_t pid; { int status; pid_t pid; pid = fork(); char *argumentos[3]; switch(pid) argumentos[0] = "ls"; { argumentos[1] = "-l"; case -1: /* error del fork() */ argumentos[2] = NULL; exit(-1); pid = fork(); case 0: /* proceso hijo */ switch(pid) execlp("ls","ls","-l",NULL); { perror("exec"); case -1: /* error del fork() */ break; exit(-1); default: /* padre */ case 0: /* proceso hijo */ printf("Proceso padren"); execvp(argumentos[0], argumentos); while(pid != wait(&status)); perror("exec"); } break; } default: /* padre */ printf("Proceso padren"); } }