Sincronizacin de procesos Rina Arauz Tipos de procesos

  • Slides: 24
Download presentation
Sincronización de procesos Rina Arauz

Sincronización de procesos Rina Arauz

Tipos de procesos n n n Proceso independiente es aquel que se ejecuta sin

Tipos de procesos n n n Proceso independiente es aquel que se ejecuta sin requerir la ayuda o cooperación de otros procesos, no afecta ni es afectado por la ejecución de otros procesos en el sistema y NO comparten datos. Procesos cooperantes (cooperan y comparten) trabajan conjuntamente en alguna actividad, para lo que deben ser capaces de comunicarse e interactuar entre ellos, se pueden afectar o ser afectados por la ejecución de otros procesos en el sistema y SI comparten datos. Tanto si los procesos son independientes como cooperantes, pueden producirse una serie de interacciones entre ellos. UNAN-Leon Sincronización 2

Productor-consumidor n n n Un proceso produce datos que son posteriormente procesados por otro

Productor-consumidor n n n Un proceso produce datos que son posteriormente procesados por otro proceso i. e. : el manejador de teclado y el programa que recoge los caracteres de un buffer Lo más cómodo es emplear un buffer circular Escribe Productor UNAN-Leon Lee Consumidor Sincronización 3

Código del productor Código del consumidor Ø El productor no puede escribir en el

Código del productor Código del consumidor Ø El productor no puede escribir en el buffer Ø El consumidor no puede leer del buffer si si está lleno está vacío Ø Comparte con el consumidor: el buffer y el el contador do do { { . . . while (contador == 0) haz_nada; produce un nuevo elemento (elemento_p) elemento_c = buffer[indice_c]; . . . indice_c = (indice_c + 1) % MAX_ELEMENTOS; while (contador == MAX_ELEMENTOS) haz_nada; contador = contador - 1; buffer[indice_p] = elemento_p; indice_p = (indice_p + 1) % MAX_ELEMENTOS; contador = contador + 1; } while (TRUE); . . . consume el elemento (elemento_c). . . } while (TRUE); UNAN-Leon Sincronización 4

Condiciones de carrera n El código anterior no funciona por existir condiciones de carrera

Condiciones de carrera n El código anterior no funciona por existir condiciones de carrera al modificar el contador. n n n Ø Ø Ø En lenguaje ensamblador: Productor Consumidor load r 0, contador add r 0, 1 sub r 0, 1 store contador, r 0 Problema: la modificación del contador no es atómica Dependiendo de la ejecución relativa de las instrucciones se puede llegar a diferentes resultados. Condiciones de carrera: se presenta cuando dos ó más procesos compiten por acceder a un mismo recurso. Si no existe sincronización, al interferirse los cambios pueden haber serias inconsistencias. Puede producirse una condición de carrera sobre una variable cuando varios procesos acceden simultáneamente a la variable para modificarla. La condición de carrera (race condition) ocurre cuando dos o más procesos acceden un recurso compartido sin control, de manera que el resultado combinado de este acceso depende del orden de llegada. UNAN-Leon Sincronización 5

Atomicidad n n Una operación se dice que es atómica (en un sistema uniprocesador)

Atomicidad n n Una operación se dice que es atómica (en un sistema uniprocesador) cuando se ejecuta con las interrupciones deshabilitadas. Las referencias y las asignaciones son atómicas en la mayoría de los sistemas. Esto no es siempre cierto para matrices, estructuras o números en coma flotante. Típicamente la arquitectura proporciona operaciones específicas para lograr la atomicidad. UNAN-Leon Sincronización 6

Ejemplo de condiciones de carrera: #include <pthread. h> #include <stdio. h> void *print_fnc( void

Ejemplo de condiciones de carrera: #include <pthread. h> #include <stdio. h> void *print_fnc( void *ptr ); int p = 5; int main() { pthread_t thr 1, thr 2; char *m 1 = "Thr 1"; char *m 2 = "Thr 2"; int r 1, r 2; r 1 = pthread_create( &thr 1, NULL, print_fnc, (void*) m 1); r 2 = pthread_create( &thr 2, NULL, print_fnc, (void*) m 2); pthread_join( thr 2, NULL); pthread_join( thr 1, NULL); printf("Thread 1 devolvio: %d y el Thread 2: %dn", r 1, r 2); } UNAN-Leon Sincronización 7

void *print_fnc( void *ptr ) { int i = 0; char *message; message =

void *print_fnc( void *ptr ) { int i = 0; char *message; message = (char *) ptr; for (i; i<1000; i++) { p = p + 1; printf("%s : %dn", (char*)message, p); sleep(1); } } Compilar: cc hilo_no_sinc. c -lpthread -o hilo_no_sinc Ejecutar: . /hilo_no_sinc UNAN-Leon Salida: Thr 2 : 6 Thr 1 : 7 Thr 1 : 8 Thr 2 : 9 Thr 2 : 11 Thr 1 : 10 Thr 1 : 12 Thr 2 : 13 Thr 1 : 14 Thr 2 : 15 Thr 1 : 16 Thr 2 : 17 Thr 1 : 18 Thr 2 : 19 Thr 2 : 20 Thr 1 : 21 Thr 1 : 22 Sincronización 8

Ejemplo (2): UNAN-Leon Sincronización 9

Ejemplo (2): UNAN-Leon Sincronización 9

Sincronización Persona A Persona B 3: 00 Mira en la nevera. No hay leche

Sincronización Persona A Persona B 3: 00 Mira en la nevera. No hay leche 3: 05 Va a la tienda 3: 10 Llega a la tienda Mira en la nevera. No hay leche 3: 15 Deja la tienda Va a la tienda 3: 20 Llega a casa y guarda la leche Llega a la tienda 3: 25 Deja la tienda 3: 30 Llega a casa y. . . UNAN-Leon Sincronización 10

Sincronización n Sincronizar hace referencia a la coordinación de procesos que se ejecutan simultáneamente

Sincronización n Sincronizar hace referencia a la coordinación de procesos que se ejecutan simultáneamente para completar una tarea (procesos cooperantes), con el fin de obtener un orden de ejecución correcto y evitar así estados inesperados. UNAN-Leon Sincronización 11

n Definiciones: n n Exclusión mutua: es el mecanismo que asegura que sólo una

n Definiciones: n n Exclusión mutua: es el mecanismo que asegura que sólo una persona o proceso está haciendo algo en un instante determinado (los otros están excluidos). Sección crítica: es la sección de código, o colección de operaciones, en el que se actualizan variables comunes. La ejecución de las secciones críticas debe ser mutuamente exclusiva para evitar inconsistencia de datos. El problema de la sección crítica consiste en diseñar un protocolo que los procesos pueden usar para conseguir la exclusión mutua de las secciones críticas. UNAN-Leon Sincronización 12

Problema de la sección crítica n Toda solución debe cumplir tres condiciones n n

Problema de la sección crítica n Toda solución debe cumplir tres condiciones n n Exclusión mutua: no pueden acceder dos procesos a la vez a la sección crítica. Progreso: cuando un proceso quiera ejecutar su sección crítica pueda hacerlo si ésta está libre. n n Espera limitada: que ningún proceso espere indefinidamente para entrar en su sección crítica. Solución general: do { protocolo de entrada sección crítica protocolo de salida resto de la sección } while (TRUE); UNAN-Leon Sincronización 13

Tipos de soluciones n Suposiciones: n n n Todos los procesos se ejecutan a

Tipos de soluciones n Suposiciones: n n n Todos los procesos se ejecutan a una velocidad distinta de cero Su velocidad relativa no influye Soluciones basadas en variables de control Soluciones basadas en instrucciones máquina específicas (test_and_set o swap) Soluciones basadas en primitivas del sistema operativo Soluciones proporcionadas por el lenguaje, regiones críticas y monitores UNAN-Leon Sincronización 14

Semáforos n n n Introducidos por Dijkstra en los años 60 Es un tipo

Semáforos n n n Introducidos por Dijkstra en los años 60 Es un tipo especial de variable que sólo puede ser accedida por dos primitivas P y V P (semáforo) n n V (semáforo) n n Operación atómica que espera hasta que el semáforo sea positivo, en este momento lo decrementa en 1. Operación atómica que incrementa el semáforo en 1. ¿Cómo quedaría el problema de la sección crítica con semáforos? P (exmut) Sección crítica V (exmut) UNAN-Leon Sincronización 15

Características de los semáforos n n n Son independientes de la máquina Son simples

Características de los semáforos n n n Son independientes de la máquina Son simples Pueden trabajar con varios procesos Pueden permitir que varios procesos entren en la sección crítica al mismo tiempo en caso de necesitarse esta posibilidad Doble uso de los semáforos: n n Exclusión mutua Sincronización UNAN-Leon Sincronización 16

n Existen básicamente dos tipos de semáforos: n n Semáforos contadores: Toman valores positivos

n Existen básicamente dos tipos de semáforos: n n Semáforos contadores: Toman valores positivos mayores o iguales a 0. Se utilizan para sincronización de procesos. Semáforos binarios: Toman los valores 0 ó 1 y se utilizan para exclusión mutua. UNAN-Leon Sincronización 17

Productor-consumidor n Restricciones: n n El consumidor espera a que haya datos en el

Productor-consumidor n Restricciones: n n El consumidor espera a que haya datos en el buffer El productor espera a que haya buffers vacíos Sólo un único proceso puede manipular el buffer a la vez Semáforos: smf_llenos, smf_vacíos y exmut n Valores iniciales: smf_llenos = 0 smf_vacíos = número_de_buffers exmut = 1 UNAN-Leon Sincronización 18

Productor P (smf_vacíos); P (exmut); Produce un dato; V (exmut); V (smf_llenos); Consumidor P

Productor P (smf_vacíos); P (exmut); Produce un dato; V (exmut); V (smf_llenos); Consumidor P (smf_llenos); P (exmut); Consume el dato; V (exmut); V (smf_vacíos); ¿Por qué el productor hace P(smf_vacíos) y V(smf_llenos)? ¿Es importante el orden en que se ejecutan las primitivas P y V? UNAN-Leon Sincronización 19

Problema del puente estrecho n n n Por un puente sólo pueden pasar o

Problema del puente estrecho n n n Por un puente sólo pueden pasar o coches que suben o coches que bajan. Solución: Variables compartidas: int contadorsubida = 0; int contadorbajada = 0; n Semáforos: semaforo exmut_s, exmut_b, puente; n Valores iniciales: n n Los semáforos inicialmente deben valer 1 No se tratan los problemas de inanición UNAN-Leon Sincronización 20

Código subida Código bajada P(exmut_s); contadorsubida++; if (contadorsubida == 1) P(puente); V(exmut_s); P(exmut_b); contadorbajada++;

Código subida Código bajada P(exmut_s); contadorsubida++; if (contadorsubida == 1) P(puente); V(exmut_s); P(exmut_b); contadorbajada++; if (contadorbajada == 1) P(puente); V(exmut_b); . . . Se sube el puente. . . Se baja el puente. . . P(exmut_s); contadorsubida--; if (contadorsubida == 0) V(puente); V(exmut_s); P(exmut_b); contadorbajada--; if (contadorbajada == 0) V(puente); V(exmut_b); UNAN-Leon Sincronización 21

Problema del barbero dormilón n Problema: 1 barbero y N sillas de espera Si

Problema del barbero dormilón n Problema: 1 barbero y N sillas de espera Si un cliente entra y no hay sillas, se va Semáforos: n n Variable compartida: n n clientes: número de clientes en espera sin contar el que está en la silla del peluquero barbero: barberos activo o inactivo exmut: exclusión mutua esperando: número de clientes esperando Inicialmente: clientes=0 barbero=0 esperando=0 UNAN-Leon exmut=1 Sincronización 22

Barbero Cliente do do { { P(clientes); P(exmut); esperando=esperando-1; V(barbero); V(exmut); /* Corta el

Barbero Cliente do do { { P(clientes); P(exmut); esperando=esperando-1; V(barbero); V(exmut); /* Corta el pelo */ } while (TRUE); UNAN-Leon P(exmut); if (esperando < SILLAS) { esperando++; V(clientes); V(exmut); P(barbero); /* Se corta el pelo */ } else { V(exmut); } } while (PELOLARGO); Sincronización 23

Comunicación con mensajes n n Válido para comunicación intermáquina Definición: n Mensaje: parte de

Comunicación con mensajes n n Válido para comunicación intermáquina Definición: n Mensaje: parte de información que es pasada de un proceso a otro n Buzón: lugar donde se depositan los mensajes desde el envío a la recepción Operaciones sobre mensajes: n Enviar n Recibir Métodos de comunicación n Comunicación en un único sentido: los mensajes fluyen en un único sentido (pipe) n n Ejemplos: Tuberías de UNIX. Comunicación bidireccional: los mensajes fluyen en ambos sentidos (sockets) n Ejemplos: Llamadas a procedimientos remotos (RPC). UNAN-Leon Sincronización 24