Sincronización de procesos Contenido • Procesos concurrentes. • El problema de la seccion critica • Problemas clásicos de comunicación y sincronización. • M e c a n i s m o s d e c o m u n i c a c i ó 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 2 Procesador 1 Lee PID Registro o posición de memoria PID = 500 PID = 500 Lee PID Incrementa y asigna PID PID = 501 Escribe PID PID = 501 PID = 500 Incrementa y asigna PID PID = 501 PID = 501 DSO 2014 5 Escribe PID 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 { ... produce un nuevo elemento (elemento_p) ... 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; ... consume el elemento (elemento_c) ... } 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 control (DecKer,Peterson,..) • Soluciones hw. basadas en instrucciones máquina específicas (test-and-set o swap) • Soluciones basadas en primitivas del SO (impartido en ARCO 2007-2008) • 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 Consumidor Proceso Productor 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; if (s <= 0) <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 Productor-consumidor • Restricciones: 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. • • 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. • DSO 2014 Semáforo escribir Semáforo exmut 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; } DSO 2014 34 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); 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 DSO 2014 barberos=0 35 exmut=1 esperando=0 Sincronización Barbero Cliente do { P(clientes); P(exmut); esperando=esperando-1; V(barberos); V(exmut); /* Corta el pelo */ } while (TRUE); DSO 2014 36 do { P(exmut); if (esperando < SILLAS) { esperando=esperando + 1; V(clientes); V(exmut); P(barberos); /* Se corta el pelo */ } else { V(exmut); } } while (PELOLARGO); 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