Sincronización de procesos
Contenido Procesos concurrentes. El problema de la seccion critica Problemas clásicos de comunicación y sincronización. Mecanismos de comunicación y sincronización. DSO 2014 2 Sincronización
Procesos concurrentes Los procesos llevan a cabo tareas para lograr un objetivo comun. Interaccionan entre ellos para: Competir por recursos Compartir recursos ES NECESARIA LA COMUNICACION y LA SINCRONIZACION (orden) ENTRE ELLOS DSO 2014 3 Sincronización
Procesos concurrentes El método mas sencillo de comunicación entre los procesos de un programa concurrente, es el uso común de unas variables de datos. Sin embargo el uso de este mecanismo puede hacer que la ejecución de un proceso interfiera en las acciones del otro. DSO 2014 4 Sincronización
Ejemplo Procesador 1 Procesador 2 PID = 500 Lee PID Registro o posición de memoria PID = 500 Incrementa y asigna PID Lee PID PID = 500 PID = 501 Escribe PID PID = 501 Incrementa y asigna PID PID = 501 PID = 501 Escribe PID DSO 2014 5 Sincronización
DSO 2014 6 Sincronización
Código del productor El productor no puede escribir en el buffer si está lleno Comparte con el consumidor: el buffer y el contador do {... ( elemento_p ) produce un nuevo elemento... while (contador == MAX_ELEMENTOS) haz_nada; buffer[indice_p] = elemento_p; indice_p = (indice_p + 1) % MAX_ELEMENTOS; contador = contador + 1; } while (TRUE); DSO 2014 7 Sincronización
Código del consumidor El productor no puede leer del buffer si está vacío Comparte con el consumidor: el buffer y el contador do { while (contador == 0) haz_nada; elemento_c = buffer[indice_c]; indice_c = (indice_c + 1) % MAX_ELEMENTOS; contador = contador - 1;... ( elemento_c ) consume el elemento... } while (TRUE); DSO 2014 8 Sincronización
Condiciones de carrera El código anterior no funciona por existir condiciones de carrera al actualizar el contador Veamos qué ocurre al ejecutar la sentencia: contador = contador + 1; Productor Consumidor load r0, contador load r0, contador add r0, 1 sub r0, 1 store contador, r0 store contador, r0 Problema: la modificación del contador no es atómica DSO 2014 9 Sincronización
Atomicidad 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 Si el HW no proporciona operaciones atómicas, éstas no pueden construirse por SW DSO 2014 10 Sincronización
DSO 2014 11 Sincronización
Cuál es el problema planteado? Alguien necesita leche, pero no tanta Exclusión mutua: es el mecanismo que asegura que sólo un proceso está haciendo algo en un instante determinado Sección crítica: es la sección de código, o colección de operaciones, en el que se actualizan variables comunes o se ejecuta código común. Cuando un proceso está ejecutando código de su SC, ningún otro proceso puede estar en su SC DSO 2014 12 Sincronización
Seccion Critica Para evitar este tipo de errores, hay que identificar las regiones de los procesos en donde se acceden a recursos compartidos y dotarlas de la posibilidad de ejecucion como si fueran una única instruccion DSO 2014 13 Sincronización
Seccion Critica Seccion Critica: Aquellas partes de los procesos concurrentes que no pueden ejecutarse de forma concurrente. Los procesos deben de acceder en Exclusion Mutua DSO 2014 14 Sincronización
Problema de la Sección Critica Sistema compuesto por n procesos Cada uno tiene un (mismo) fragmento de código: sección crítica Sólo uno de los procesos en cada instante puede ejecutar en la sección crítica Cuando un proceso está ejecutando en la sección crítica, ningún otro puede hacerlo DSO 2014 15 Sincronización
Problema de la Sección Critica Para conseguir dicha exclusión mutua se deben de implementar protocolos software o hardware que impidan o bloqueen el acceso a una SC mientras está siendo utilizada por otro proceso. Solución general: do { protocolo de entrada sección crítica protocolo de salida resto de la sección } while (TRUE); DSO 2014 16 Sincronización
Problema de la sección crítica Toda solución debe cumplir tres condiciones Exclusión mutua Progreso Espera limitada DSO 2014 17 Sincronización
Tipos de soluciones Soluciones soft. basadas en variables de (.., DecKer,Peterson ) control Soluciones hw. basadas en instrucciones máquina específicas (test-and-set o ( swap Soluciones basadas en primitivas del SO ( 2007-2008 (impartido en ARCO Soluciones basadas en regiones críticas y monitores DSO 2014 18 Sincronización
Problemas clásicos de comunicación y sincronización El problema del productor-consumidor El problema de los lectores-escritores Comunicación cliente-servidor DSO 2014 19 Sincronización
Problema del productorconsumidor Proceso Productor Proceso Consumidor Flujo de datos Mecanismo de comunicación DSO 2014 20 Sincronización
El problema de los lectores-escritores Lector Lector Escritor Lector Escritor Recurso DSO 2014 21 Sincronización
Comunicación clienteservidor Computador Computador Petición Proceso cliente Proceso servidor S.O. Respuesta DSO 2014 22 Sincronización
Primitivas del SO para comunicación y sincronizacion
Primitivas del SO Mecanismos de comunicación Tuberías (pipes, FIFOS) Paso de mensajes Mecanismos de sincronizacion Servicios del sistema operativo: Señales (asincronismo) Tuberías (pipes, FIFOS) Semáforos Paso de mensajes Las operaciones de sincronización deben ser atómicas DSO 2014 24 Sincronización
Semáforos 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): operación atómica que espera hasta que la variable semáforo sea positiva, en este momento la decrementa en 1 V (semáforo): operación atómica que incrementa la variable semáforo en 1 Cómo quedaría el problema de la sección crítica con semáforos? DSO 2014 25 Sincronización
Operaciones sobre Semáforos Wait(s) { s = s - 1; if (s < 0) { <Bloquear al proceso> } } signal(s) { s = s + 1; ( 0 <= (s if <Desbloquear a un proceso bloqueado por la operacion wait> } } DSO 2014 26 Sincronización
Características de los semáforos Son independientes de la máquina Son simples Pueden trabajar con varios procesos Doble uso de los semáforos: Exclusión mutua Sincronización DSO 2014 27 Sincronización
Secciones críticas con semáforos Wait(s); /* P(s) entrada en la seccion critica */ < seccion critica > signal(s); /* V(S) salida de la seccion critica */ El semáforo debe tener valor inicial 1 DSO 2014 28 Sincronización
DSO 2014 29 Sincronización
Restricciones: Productor-consumidor 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 Inicialización: smf_llenos = 0 smf_vacíos = número_de_buffers exmut = 1 DSO 2014 30 Sincronización
Productor Consumidor P (smf_vacíos); P (exmut); Produce un dato; V (exmut); V (smf_llenos); 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? Cómo podemos extender el problema si hay dos consumidores? DSO 2014 31 Sincronización
Lectores-escritores Descripción: Los escritores acceden a la BBDD cuando no haya ningún otro escritor y ningún lector. Semáforo escribir Los lectores acceden cuando no haya ningún escritor accediendo o esperando. Semáforo leer Variables compartidas: LA, LE, EA, EE. A estas variables accederemos en exclusión mutua. Semáforo exmut DSO 2014 32 Sincronización
Iniciación leer = escribir = 0 exmut = 1 LA = EA = LE = EE = 0 Además: Los escritores tienen prioridad sobre los lectores DSO 2014 33 Sincronización
Lector Escritor P (exmut); if ((EA + EE) == 0) { V (leer); LA = LA + 1; } else { LE = LE + 1; } V (exmut); P (leer); Leemos los datos; P (exmut); LA = LA - 1; if (LA == 0 && EE > 0) { V (escribir); EA = EA + 1; EE = EE - 1; } P (exmut); if (( EA + LA + EE) == 0) { V (escribir); EA = EA + 1; } else { EE = EE + 1; } V (exmut); P (escribir); Escribimos los datos; P (exmut); EA = EA - 1; if (EE > 0) { V (escribir); EA = EA + 1; EE = EE - 1; } else while (LE > 0) { V (leer); LA = LA + 1; LE = LE - 1; } V (exmut); DSO 2014 34 Sincronización
Problema del barbero dormilón Problema: 1 barbero y N sillas de espera Si un cliente entra y no hay sillas, se va Semáforos: clientes: número de clientes en espera sin contar el que está en la silla del peluquero barberos: número de barberos inactivos exmut: exclusión mutua Variable compartida: esperando: número de clientes esperando Inicialmente: clientes=0 barberos=0 exmut=1 esperando=0 DSO 2014 35 Sincronización
Barbero Cliente do { P(clientes); P(exmut); esperando=esperando-1; V(barberos); V(exmut); /* Corta el pelo */ } while (TRUE); do { P(exmut); if (esperando < SILLAS) { esperando=esperando + 1; V(clientes); V(exmut); P(barberos); /* Se corta el pelo */ } else { V(exmut); } } while (PELOLARGO); DSO 2014 36 Sincronización
Problema del puente estrecho Por un puente sólo pueden pasar o coches que suben o coches que bajan. Solución: Variables compartidas: int contadorsubida = 0, contadorbajada = 0; semaforo exmut_s, exmut_b, puente; Iniciación: Los semáforos inicialmente deben valer 1 No se tratan los problemas de inanición DSO 2014 37 Sincronización