La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Capítulo 3 Concurrencia: exclusión mutua y sincronización. Comunicación entre procesos.

Presentaciones similares


Presentación del tema: "Capítulo 3 Concurrencia: exclusión mutua y sincronización. Comunicación entre procesos."— Transcripción de la presentación:

1 Capítulo 3 Concurrencia: exclusión mutua y sincronización. Comunicación entre procesos.

2 3.1 Programación concurrente.
3.1. Introducción. Exclusión mutua (1). El sistema operativo, y los programas de usuario, son un conjunto de procesos que se ejecutan de forma asíncrona. Algunos de ellos cooperan. Cuando es necesaria comunicación entre ellos ha de existir una coordinación o sincronización. La comunicación entre los procesos es necesaria (tuberías). Atendiendo a la concurrencia los procesos se pueden clasificar en: Procesos independientes: No puede ser afectado por el resto de los procesos. Su estado no es compartido por ningún otro proceso. Son deterministas, para unas entradas dadas la salida es siempre la misma. Son reproducibles. Pueden ser detenidos y arrancados sin ningún problema. Su ejecución termina sin mayor problema que un mayor tiempo. Procesos cooperantes: Cuando comparten su estado (mismo sistema de ficheros, memoria, etc.). Pueden No ser deterministas. Pueden ser irreproducibles.

3 3.1 Programación concurrente.
3.1. Introducción. Exclusión mutua (2). Labores del sistema operativo. Seguir la pista de los distintos procesos activos. Controlar la asignación y retirada los recursos: Tiempo de procesador. Memoria. Archivos. Dispositivos de E/S. Proteger los datos y los recursos físicos. Los resultados de un proceso deben ser independientes de la velocidad relativa a la que se realiza la ejecución de otros procesos concurrentes.

4 3.1 Programación concurrente.
3.1. Introducción. Exclusión mutua (3). Condiciones de Carrera (Race Conditions) Los procesos necesitan intercambiar información. Los intercambios de información se realizan compartiendo espacios de almacenamiento donde leer y escribir: disco, memoria. Ej: Escritura en una PRN. Proceso enviando a un directorio. Proceso de SPOOLing demonio que imprime. Existe una misma estructura de datos para los dos procesos. Concurrencia. Comunicación entre procesos. Compartición y competencia por los recursos. Sincronización de la ejecución de varios procesos. Asignación del tiempo de procesador a los procesos.

5 Un ejemplo sencillo Proceso P1 Proceso P2 void echo() {
ent = getchar(); sal = ent; putchar(sal); } Proceso P1 Proceso P2 ent = getchar(); . . ent = getchar(); sal = ent; sal = ent; putchar(sal); putchar(sal);

6 3.1 Programación concurrente.
3.1. Introducción. Exclusión mutua (4). Problema ejemplo a estudio. Sea un sistema con N slots para situar archivos para impresión en el SPOOLing. Sean dos procesos A y B queriendo acceder a una sección crítica. Si A selecciona el sloti para imprimir. Al comenzar la operación A es desplanificado. B es planificado y selecciona el sloti a imprimir. B almacena su información en el sloti. A es planificado y continua salvando información en sloti. La información almacenada por B es reemplazada por A.

7 3.1 Programación concurrente.
3.1. Introducción. Exclusión mutua (5). Dificultades con la concurrencia. Compartir recursos globales. Gestionar la asignación óptima de recursos. Localizar un error de programación. No determinismo. El acceso a los recursos no siempre puede simultanearse. La requisa no es siempre posible. Las operaciones de escritura deben ser mutuamente excluyentes. Las secciones críticas garantizan la integridad de los datos.

8 3.1 Programación concurrente.
3.1. Introducción. Exclusión mutua (6). Sección Crítica: Zonas de programa o recursos que solo pueden ser poseídos en un instante determinado por un proceso dado. Archivos, memoria, recursos compartidos. Directrices: No puede existir dos procesos simulteneamente en una Sección Crítica. Un proceso que se interrumpe en una sección crítica debe hacerlo sin interferir con los otros procesos. Ningún proceso puede esperar indefinidamente para entrar en la SC (inanición o interbloqueo ). Cuando ningún proceso está en su sección crítica, cualquier proceso que solicite la entrada debe poder hacerlo. Ningún proceso fuera de su SC puede bloquear a otro. No se deben hacer suposiciones sobre la velocidad relativa de los procesos o el número de procesadores. Un proceso permanece en su sección crítica sólo por un tiempo finito. Los procesos se autoexcluyen (exclusión mutua). Resultado: Interbloqueo. Inanición.

9 3.1 Programación concurrente.
Soluciones por software (1). Se supone la existencia de mecanismos básicos de exclusión por hardware. Ej. Solo se puede acceder a una posición de memoria en un instante dado. Posición en memoria de turno. Espera activa: Un proceso siempre está esperando a entrar en su sección crítica. Un proceso no puede hacer nada productivo hasta que obtiene permiso para entrar en su sección crítica. Variable cerrojo. Varible que controla el acceso a la SC. El proceso chequea el valor y si está libre entra. El problema se puede plantear si el proceso es requisado tras recibir un OK de la variable.

10 3.1 Programación concurrente.
Soluciones por software (2). Alternancia estricta. Una variable (turn) controla el acceso de cada proceso. El proceso saliente de la SC cambia el valor de la variable. El turno se lo pasa al otro proceso. Los procesos realizan una espera ocupada. La alternancia estricta obliga a la espera de un proceso aunque el otro no entre. Los dos procesos han de realizar el mismo número de entradas en la SC. Proceso lento y no válido para procesos con ritmo distinto. Infringe las reglas 3 y 4: “No puede permitirse el interbloqueo o la inanición”. “Ningún proceso fuera de su SC puede bloquear a otro.” while (true) { while (turn!=0) /* espera */ sección_critica(); turn=1; zona_no_crítica(); } while (turn!=1) /* espera */ turn=0;

11 3.1 Programación concurrente.
Soluciones por software (3). Señal de interés. while (TRUE) { señal[0]= TRUE; while (señal[1]=TRUE) /* Bucle de espera */ sección_critica(); señal[0]= FALSE; } while (TRUE) { señal[1]= TRUE; while (señal[0]=TRUE) /* Bucle de espera */ sección_critica(); señal[1]= FALSE; } Problema si ambos proceso ponen su señal igual a TRUE a la vez.

12 3.1 Programación concurrente.
Soluciones por software (4). Solución de Peterson (1). Se incorporan variables para informar del otro proceso. Cada proceso pide la entrada en la SC con su número de proceso (llamada a la función). Cuando un proceso muestra su interés por entrar y ve al otro interesado se bloquea. El proceso espera hasta la entrada. P0 pide la entrada (informa de que está interesado[0]=TRUE). P1 ha de esperar hasta que interesado[0]= FALSE Esto se produce con la salida de P0. En caso de conflicto (P0 y P1 solicitan la entrada) el último espera. La variable turn resulta sobre-escrita.

13 3.1 Programación concurrente.
Soluciones por software (5). Solución de Peterson (2). #define FALSE 0 #define TRUE 1 #define N 2 /* Número de procesos */ int turn; int interesado [N]; void entrada_a_la_sec (int proceso) /* El proceso entra indicando su número*/ { int otro; otro = 1- proceso; interesado[proceso] = TRUE; turn = proceso; while ((turn == proceso) && (interesado[otro] == TRUE)) /* Bucle de espera */; } void salir_de_la_sec( int proceso) interesado[proceso] = FALSE;

14 3.1 Programación concurrente.
Soluciones por hardware (1). Desconexión de IRQs: Antes de entrar en la SC se permite al proceso desconectar las IRQs. Se evita su desplanificación. Problema: Mucho control sobre el sistema para procesos de usuario. Problemas en sistemas paralelos. Otro proceso puede estar ejecutandose en otra CPU. Solo es válido para algunos procesos del núcleo.

15 3.1 Programación concurrente.
Soluciones por hardware (2). Test and Set Lock (TSL) / Comparar y fijar (1). Se hace uso del hardware. Control de un registro (MEM). Variable cerrojo. Se realizan en un único ciclo de instrucción. No están sujetas a injerencias por parte de otras instrucciones. Leer y escribir. Leer y examinar. De forma indivisible se chequea el valor del registro y se cambia si procede la entrada en la SC. enter(SC) . A la salida el proceso ha de devolver la variable a su valor de libre. leave(SC) En el caso de multiprocesadoras se ha de cerrar el BUS de acceso a MEM durante el Test. Observaciones: El proceso a entrar realiza un espera ocupada. Las llamadas de enter(SC) y leave(SC) se han de realizar en el orden correcto. Se realiza espera ocupada. Problemas cuando las prioridades de los procesos son muy dispares. boolean TS( int i) { if (i==0) i=1; return TRUE; } else return FALSE;

16 3.1 Programación concurrente.
Soluciones por hardware (3). Test and Set Lock (TSL) / Comparar y fijar (2). Ventajas: Es aplicable a cualquier número de procesos en sistemas con memoria compartida, tanto de monoprocesador como de multiprocesador. Es simple y fácil de verificar. Puede usarse para disponer de varias secciones críticas. Desventajas: La espera activa consume tiempo del procesador. Puede producirse inanición cuando un proceso abandona la sección crítica y hay más de un proceso esperando. Interbloqueo: Si un proceso con baja prioridad entra en su sección crítica y existe otro proceso con mayor prioridad, entonces el proceso cuya prioridad es mayor obtendrá el procesador para esperar a poder entrar en la sección crítica.

17 3.1 Programación concurrente.
Soluciones por hardware (4). Función swap/intercambio. Intercambio indivisible de la información entre un registro de la CPU y una variable. Válida para varios procesos. Cada proceso dispone de una variable cerrojo = 1. La entrada a la sección crítica va precedida por el intercambio del valor de la variable con el de un registro en la CPU que inicialmente tiene un valor registro = 0. n es el número de procesos

18 3.1 Programación concurrente.
Soluciones por hardware Problemas (5). Se emplea espera activa. Revisión continua del valor de la variable para ver si se tiene acceso a la SC. Posible inanición Selección arbitraria entre los procesos en espera. Algún proceso puede no ser seleccionado nunca. Posible interbloqueo. Dos procesos uno en la SC y con baja prioridad (no planificable) y otro a la espera con alta prioridad.

19 3.1 Programación concurrente.
Soluciones por semáforos. Soluciones previas: Sleep() y wakeup() Evitan la espera ocupada. El proceso que no puede entrar en la SC se duerme: no es planificado (no consume tiempo de CPU). El proceso saliente de la SC ha de despertar al proceso durmiente. Problema ejemplo: Productor-consumidor mediante buffer. Premisas: Dos procesos (P1, P2) comparten un buffer para su comunicación. El buffer contiene N slots (finito). P1 produce información y la situa en el buffer hasta que este está lleno. => sleep() P2 retira información del buffer hasta que este está vacío. => sleep() P1 despierta si el buffer vuelve a tener huecos. P2 despierta si el buffer vuelve a tener información. Se define una variable count que almacena el número de slots con información.

20 3.1 Programación concurrente.
Soluciones por semáforos. Soluciones previas: sleep() y wakeup() #define N 100 int count = 0; void productor (void) { int item; while (TRUE){ produce_un_elementos(&item); if (count == N) sleep(); depositar_elemento (item); count = count +1; if (count == 1) wakeup(consumidor); } void consumidor (void) { int item; while (TRUE){ if (count == 0) sleep(); obtener_un_elementos (&item); count = count - 1; if (count == N-1) wakeup(productor); consumir_elemento (item); }

21 3.1 Programación concurrente.
Soluciones por semáforos. Soluciones previas: sleep() y wakeup() Problema El proceso P2 es desplanificado tras chequear el valor de la variable count=0, se dispone a bloquearse (dormir) pero antes ... El consumidor P1 es planificado y genera información, count=1 Señal wakeup() al P2. P2 no está todavía dormido. Se pierde la señal. P2 vuelve a ser planificado y recuerda el valor count=0 => sleep(). P1 genera info. Llena el buffer => sleep() Solución pasa por una variable que almacene el número de wakeup() emitidos/perdidos.

22 3.1 Programación concurrente.
Soluciones por semáforos. Semáforo Variable capaz de almacenar el número de wakeup() emitidos. Los chequeos y cambio de variable: Indivisibles. Operación única. Acción atómica. Mediante llamadas al sistema (el sist. desconecta las IRQs). En el caso de multiprocesadoras los semáforos han de ser operados mediante TSL. Cada semáforo incorpora una cola con los procesos FIFO (robusto) o sin un orden específico (débil). Operadores: down() => sleep() up() => wakeup() up() => semáforo++; down() => chequea el valor de la variable. Si semáforo=0 => proceso a dormir sleep(); Si semáforo>0 => semáforo--;

23 3.1 Programación concurrente.
Soluciones por semáforos. Productor consumidor con semáforos. 3 semáforos: full : número de slots ocupados (0). empty : número de slots libres (N). mutex: control el acceso del proceso (1). Garantiza la exclusión mutua. Cada semáforo se asocia con un dispositivo o recurso. #define N 100 semaphore mutex=1; semaphore empty=N; semaphore full=0; void producer() { int item; while (TRUE){ produce_item(&item); down(&empty); down(&mutex); enter_item(item); up(&mutex); up(&full); } void consumidor() down(&full); remove_item(item); up(&empty);

24 Contadores de eventos No necesitan la exclusión mutua. Operación:
read(E) => lee E advance (E) => E++ await(E,v) => espera hasta que E  v Solo incrementos. Valor inicial = 0. Dos variables: se controla la diferencia. in => los que entran Out => los que salen.

25 3.1 Programación concurrente.
Monitores. Mecanismo de mayor abstracción: Módulo de software. Características básicas: Las variables de datos locales están sólo accesibles para el monitor. Un proceso entra en el monitor invocando a uno de sus procedimientos. Sólo un proceso se puede estar ejecutando en el monitor en un instante dado. Módulo formado por: Procedimientos. Variables. Estructuras de datos. Eliminan la posibilidad de error por imponer el orden de los semáforos. Todo acceso se hace mediante las funciones que entrega el monitor. No hay acceso directo al interior. El sistema garantiza que solo existe un proceso activo dentro del monitor. El compilador construye las llamadas y la exclusión.

26 3.1 Programación concurrente.
Monitores. Funciones para bloqueo: wait() y signal(): Dentro del monitor, sobre las variables del sistema. signal: Despierta al proceso durmiente en la variable. Es la última instrucción que se ha de ejecutar antes de salir del monitor. Exclusión mutua. No son muy acumulativos. Las señales a un proceso que no espera se pierden. wait y signal: exclusión mutua automática. sleep y wakeup: necesitan exclusión mutua.

27 3.1 Programación concurrente.
Canales de Comunicación. El intercambio de información entre procesos necesita: Buffer compartido. Código específico. El programador ha de conocer todos los detalles. La comunicación mediante mensajes. No necesitan compartir memoria. Se ha de considerar: Comunicación directa ó indirecta. Bidireccional ó unidireccional. Buffering automático o explicito. Por copia o por referencia. Tamaño del mensaje fijo o variable.

28 3.1 Programación concurrente.
Canales de Comunicación. Comunicación directa Nombres: Se enuncia explícitamente el destinatario o emisor del mensaje. Se definen primitivas del tipo: send(proc, mensaje); receive (proc, mensaje); Propiedades: Vínculo automático de los procesos en comunicación con solo conocer la identidad del otro proceso. Comunicación de proceso a proceso (dos). Válido sólo para dos procesos. Para un par de procesos existe sólo un vínculo. El vínculo puede ser bidireccional o unidireccional. Problema: El cambio de nombre de los procesos.

29 3.1 Programación concurrente.
Canales de Comunicación. Comunicación indirecta. Se usan buzones o puertos. Cada buzón posee un identificador. Se permiten varios buzones. Los buzones han de estar compartidos. Primitivas: send(puzón, mensaje); receive (buzón, mensaje); Propiedades: La comunicación se realiza sólo si existe un buzón común. Se permite el establecer un vínculo con dos o más procesos. Para dos o más proceso comunicándose pueden existir varios vínculos. 1link 1 buzón. Comunicación unidireccional y bidireccional.

30 3.1 Programación concurrente.
Canales de Comunicación. Pertenencia del buzón. Usuario. El buzón desaparece con el proceso que lo inicia. Sistema Operativo. Existencia propia. No está vinculado a ningún proceso. El S.O. permite: Crear buzones. Envío y recepción de mensajes. Destrucción de buzones. Capacidad. Existe un número máximo de mensajes que se pueden almacenar en el buzón. Tipos: Capacidad 0: Longitud máxima = 0. No puede retener ningún mensaje. Sincronización entre procesos emisor y receptor. Capacidad encadenada: Longitud finita N. Emisión mientras hay slots libres. Capacidad no encadenada: Longitud infinita.

31 3.1 Programación concurrente.
Canales de Comunicación. Identificación. Se necesita un canal seguro: encriptación. Identificación máquina:proceso Problemas de saturación, duplicidad o consistencia. Dominios:=> Número random de 64 bits. Definiciones: Mensaje: Parte de la información que es pasada de un proceso a otro. Buzón: buffer de almacenamiento de mensajes desde que llegan a la máquina hasta que son retirados por el proceso consumidor.

32 3.1 Programación concurrente.
Canales de Comunicación. Mensajes Estructura del mensaje: Cabeza: remite, destino, longitud, etc. Cuerpo: información. Mensaje: No hay problema de compartir memoria entre procesos. Permite la computación distribuida. No se necesita coordinar los programadores de los distintos módulos. Se necesita un protocolo de comunicación común. Existen más posibilidades de pérdida de mensajes. Problemas en los procesos (hang) Demoras en espera de comunicación por parte del sistema de problema o espera de time out. Pérdida de mensajes por la red. El SO ha de descubrir el error y reenviar el mensaje. El proceso emisor ha de comprobar la recepción y repetir. El SO detecta el problema y notifica la necesidad de repetir. Depende de Sistema y usuario que se detecten las pérdidas. Otro problema es la recepción del asentimiento. Posible solución es el Nº de mensaje.

33 Mecanismos de comunicación
Señales. Asíncronas.Indican activación de un evento. Tuberías. Camino continuo de comunicación entre dos procesos. FIFO. La gestión la realiza el SO. Las crea el proceso que ha de comunicarse y desaparecen con él. Las tuberías con nombre permanecen. Son similares a un archivo. Colas de mensajes. Comunicación continua entre procesos. Se tratan como zonas de memoria  problemas de tamaño. Semáforos. Sincronización entre procesos que comparten recursos. Mantienen sección crítica. Asociados a los recursos. Memoria compartida. Zona de memoria accesible simultáneamente por varios procesos. Acceso aleatorio: exige el conocimiento por parte de los procesos de la estructura de la información que contiene. Acceso rápido, efectivo, flexible. Válido para varios procesos. La zona viene asociada a un semáforo. Buzones (sockets). Similares a tuberías. Comunican procesos situados en distintos nodos de la red.


Descargar ppt "Capítulo 3 Concurrencia: exclusión mutua y sincronización. Comunicación entre procesos."

Presentaciones similares


Anuncios Google