Professional Documents
Culture Documents
Exclusi on mutua
Gustavo Romero
Arquitectura y Tecnolog a de Computadores
4 de febrero de 2013
c Gustavo Romero
Indice
1 2 3
5 6
c Gustavo Romero
Lecturas recomendadas
Operating Systems (9, 10, 11) Fundamentos de Sistemas Operativos (4, 6, 7) Sistemas Operativos (5, 6) Sistemas Operativos Modernos (2)
c Gustavo Romero
Introducci on
c Gustavo Romero
c Gustavo Romero
Suponga que todas estas son hebras de un mismo proceso y que la hebra 1 ha conseguido entrar en la secci on cr tica roja. Qu e otros IP son v alidos al mismo tiempo?
c Gustavo Romero Exclusi on mutua (6/108)
c Gustavo Romero
// patr on de comportamiento // habitual de una hebra que // ejecuta una secci on cr tica while(true) { entrar secci on_cr tica secci on_cr tica salir secci on_cr tica secci on_no_cr tica }
Cada hebra se ejecuta a una velocidad no cero pero no podemos hacer ninguna suposici on acerca de su velocidad relativa de ejecuci on. Aunque dispongamos de m as de un procesador la gesti on de memoria previene el acceso simult aneo a la misma localizaci on.
c Gustavo Romero
Algoritmo de Peterson.
c Gustavo Romero
Exclusividad:
Como m aximo una hebra puede entrar en su secci on cr tica.
Progreso:
Ninguna hebra fuera de su secci on cr tica puede impedir que otra entre en la suya.
Portabilidad:
El funcionamiento correcto no puede basarse en...
la velocidad de ejecuci on. el n umero o tipo de los procesadores. la pol tica de planicaci on del SO.
c Gustavo Romero
Exclusividad:
Si no se cumple la soluci on es incorrecta.
Progreso:
Los protocolos m as sencillos a veces violan este requisito.
Portabilidad:
Algunas soluciones dependen de...
el n umero o tipo de los procesadores. la pol tica de planicaci on del SO.
c Gustavo Romero
Justicia:
Si varias hebras esperan para entrar en su secci on cr tica deber amos permitir que todas entrasen con parecida frecuencia.
Escalabilidad:
Debe funcionar igual de bien para cualquier n umero de hebras.
Simplicidad:
Deben ser f aciles de usar el esfuerzo de programaci on debe ser lo m as peque no posible.
c Gustavo Romero
Usuario
c Gustavo Romero
Hebra 1 while(true) { while (turno != 1); secci on cr tica(); turno = 0; secci on no cr tica();
Debemos inicializar la variable turno. La hebra Hi ejecuta su secci on cr tica si y s olo si turno == i. Hi se mantiene en espera ocupada mientras Hj est a en su secci on cr tica exclusividad satisfecha. El requisito de progreso no es satisfecho porque estamos suponiendo la alternancia estricta de las 2 hebras.
An alisis del algoritmo 1: es correcto? (2) Supongamos SNC0 larga y SNC1 corta. Si turno == 0, H0 entrar a en su SC0 , la abandonar a haciendo turno = 1 y comenzar aa ejecutar su larga SNC0 . Ahora H1 entrar a en su SC1 , la abandona haciendo turno = 0 y ejecuta su corta SNC1 . Si de nuevo H1 intenta entrar en su SC1 , debe esperar hasta que H0 nalice su larga SNC0 y pase de nuevo por SC0 .
c Gustavo Romero Exclusi on mutua (19/108)
Algoritmo 2
Cu al es el principal problema del primer algoritmo? Almacenamos el identicador de hebra en la variable compartida usada para sincronizar y el identicador de cada hebra ha de establecerlo la otra.
Podemos hacerlo mejor? Hagamos que cada hebra sea responsable de modicar la variable compartida para permitirse el uso de la secci on cr tica. Ahora las hebras competir an por el uso de la secci on cr tica en lugar de cooperar.
c Gustavo Romero
Algoritmo 2
variables compartidas bool bandera[2] = {false, false}; hebrai while (true) { while (bandera[j]); bandera[i] = true; secci on cr tica(); bandera[i] = false; secci on no cr tica(); }
Necesitamos una variable l ogica por cada hebra. Hi muestra su deseo de entrar en su secci on cr tica haciendo bandera[i] = true No satisface el requisito de exclusividad. Satisface el requisito de progreso.
c Gustavo Romero
Algoritmo 3
variables compartidas bool bandera[2] = {false, false}; hebrai while (true) { bandera[i] = true; while (bandera[j]); secci on cr tica(); bandera[i] = false; secci on no cr tica(); }
Necesitamos una variable l ogica por cada hebra. Hi muestra su deseo de entrar en su secci on cr tica haciendo bandera[i] = true Satisface el requisito de exclusividad. Satisface el requisito de progreso.
c Gustavo Romero
Algoritmo 3: es correcto? Imaginemos la siguiente secuencia de ejecuci on: H0 : bandera[0] = true; H1 : bandera[1] = true; Qu e pasar a? Ambas hebras esperar an para siempre y ninguna podr a entrar en su secci on cr tica = interbloqueo.
c Gustavo Romero Exclusi on mutua (25/108)
Algoritmo 4
Cu al es el principal problema del algoritmo 3? Cada hebra establece su estado sin preocuparse del estado de la otra hebra. Si las dos hebras insisten en entrar simult aneamente se produce un interbloqueo.
Podemos hacerlo mejor? Cada hebra activa su bandera indicando que desea entrar pero la desactiva si ve que la otra tambi en quiere entrar.
c Gustavo Romero
Algoritmo 4
variables compartidas bool bandera[2] = {false, false}; hebrai while (true) { bandera[i] = true; while (bandera[j]) { bandera[i] = false; // retardo bandera[i] = true; }; secci on cr tica(); bandera[i] = false; secci on no cr tica(); }
c Gustavo Romero
bandera expresa el deseo de entrar en la secci on cr tica. Hi hace bandera[i] = true pero est a dispuesta a dar marcha atr as. Satisface el requisito de exclusividad. Satisface el requisito de progreso. No satisface el requisito de espera acotada.
Exclusi on mutua (28/108)
Algoritmo de Dekker
variables compartidas bool bandera[2] = {false, false}; int turno = 0; // desempate hebrai while (true) { bandera[i] = true; while (bandera[j]) { if (turno == j) { bandera[i] = false; while (turno == j); bandera[i] = true; } } secci on cr tica(); turno = j; bandera[i] = false; secci on no cr tica(); }
Exclusi on mutua (30/108)
bandera expresa la intenci on de entrar en la secci on cr tica. turno indica cu al es la hebra preferida en caso de empate. Hi hace bandera[i] = true pero est a dispuesta a dar marcha atr as con la ayuda de turno.
c Gustavo Romero
Algoritmo de Peterson
variables compartidas bool bandera[2] = {false, false}; int turno = 0; // desempate hebrai while (true) { bandera[i] = true; turno = j; while (bandera[j] && turno == j); secci on cr tica(); bandera[i] = false; secci on no cr tica(); }
c Gustavo Romero
La hebra i muestra su deseo de entrar en su secci on cr tica haciendo bandera[i] = true. Si ambas hebras intentan entrar a la vez en su secci on cr tica la variable turno decide quien va a pasar. En comparaci on con el algoritmo de Dekker es m as eciente, m as simple y extensible a m as de 2 hebras.
Exclusi on mutua (32/108)
Si turno == i Hi podr a entrar en su secci on cr tica. Si turno == j Hj entrar a en su secci on cr tica y har a bandera[j] = false a la salida y permitir a a Hi entrar.
Si a Hj le da tiempo a hacer bandera[j] = true, har a turno = i. Como Hi no cambia el valor de turno mientras est a esperando en el while, Hi podr a entrar en su secci on cr tica tras como mucho una ejecuci on de la secci on cr tica de Hj .
c Gustavo Romero Exclusi on mutua (33/108)
Sin embargo, ninguna soluci on proporcionar a robustez frente a una hebra que falle en su secci on cr tica... Por qu e?
Una hebra que falle en su secci on cr tica no podr a ejecutar on cr tica() con lo que impedir aa salir de secci cualquier otra hebra entrar en su secci on cr tica porque no on cr tica(). podr an nalizar entrar en secci
c Gustavo Romero
Inconvenientes de las soluciones a nivel de usuario Las hebras intentando entrar en una secci on cr tica bloqueada se mantienen en espera ocupada = se desperdicia tiempo del procesador. Si la secci on cr tica tarda mucho tiempo en ejecutarse puede ser m as eciente bloquear a la hebra. Con un u nico procesador y una pol tica de prioridad est atica, la espera ocupada puede llevar a la inanici on.
c Gustavo Romero Exclusi on mutua (38/108)
Hardware
c Gustavo Romero
Qu e podr a suceder si existieran llamadas a adquirir() sin su correspondiente liberar() emparejado? Qu e pasa si el propietario de un cerrojo trata de adquirirlo por segunda vez?
c Gustavo Romero Exclusi on mutua (40/108)
retirar fondos de una cuenta bancaria while (true) { cerrojo.adquirir(); saldo = conseguir saldo(cuenta); saldo = saldo - cantidad; almacenar saldo(cuenta, saldo); cerrojo.liberar(); return saldo; }
c Gustavo Romero
c Gustavo Romero
condici on de carrera
c Gustavo Romero Exclusi on mutua (43/108)
Implementaci on de operaciones at omicas El soporte hardware puede facilitar la tarea: Deshabilitar las interrupciones: cli/sti
Por qu e funciona? Por qu e puede esta acci on evitar el cambio de hebra? Funcionar a en cualquier tipo de sistema? no, v alido s olo en sistemas con un u nico procesador.
Instrucciones at omicas:
Existen instrucciones para las que el procesador y el bus garantizan su ejecuci on at omica.
TAS FAA CAS LL/SC Test And Set: lock xchg %al,( %edx) Fetch And Add: lock xadd %eax,( %edx) Compare And Swap: lock cmpxchg %ecx,( %edx) Load Linked/Store Conditional: ldrex/strex
c Gustavo Romero
hebrai
while(true) { deshabilitar interrupciones(); secci on cr tica(); habilitar interrupciones(); secci on no cr tica(); }
Se preserva la exclusi on mutua pero se degrada la eciencia del sistema: mientras est a en la secci on cr tica no se atender an interrupciones. No habr a tiempo compartido. El retraso en la atenci on de las interrupciones podr a afectar al sistema completo. Por qu e? Las aplicaciones podr an abusar o contener fallos = cuelgue del sistema.
c Gustavo Romero
En resumen: Los efectos laterales son inaceptables en general. La buena noticia es que esta operaci on es privilegiada :)
c Gustavo Romero
variable compartida cerrojo_t cerrojo; hebrai while(true) { cerrojo.adquirir(); secci on cr tica(); cerrojo.liberar(); secci on no cr tica(); }
c Gustavo Romero
Permite implementar cerrojos (spin lock) de forma at omica: Existe alguna condici on de carrera? no. Utilizar as esta soluci on para resolver un problema de secci on cr tica? no. Cu al es su principal desventaja? espera ocupada con efectos laterales sobre el sistema. Es capaz de detectar un grave error? *
Exclusi on mutua (50/108)
c Gustavo Romero
Con esta soluci on es posible el cambio de hebra. Todav a no es una soluci on v alida porque no es portable y depende del n umero de procesadores.
Exclusi on mutua (51/108)
Instrucciones at omicas
Lectura/modicaci on/escritura sobre una posici on de memoria:
lock2 xchg %eax,( %edx): intercambia de forma at omica el valor del registro con la direcci on de memoria. lock xadd %eax,( %edx): intercambia y suma, %eax = ( %edx), ( %edx) = %eax + ( %edx). lock cmpxchg %ecx, ( %edx): compara el acumulador con ( %edx). Si son iguales activa ZF = 1 y hace ( %edx) = %ecx. En otro caso limpia ZF = 0 y lleva ( %edx) al acumulador.
Existe todav a alguna condici on de carrera? no. Es portable? no. Es eciente? no. Qu e sucede cuando muchas hebras intentan adquirir el cerrojo? baja la tasa de aprovechamiento del procesador debido a la espera ocupada. Puede llamarse a adquirir() recursivamente?
Exclusi on mutua (56/108)
c Gustavo Romero
Adem as hay un grave peligro de otra clase de inanici on en sistemas con un s olo procesador. Recordar lo que pasaba al utilizar espera ocupada a nivel de usuario y exist an diferentes tama nos de secci on no cr tica.
c Gustavo Romero
c Gustavo Romero
Efecto ping-pong
El efecto ping-pong entre la cach e 1 y la cach e 2 monopoliza, y desperdicia, el uso del bus del sistema. Es necesario implementar cerrojos m as ecientes.
c Gustavo Romero Exclusi on mutua (60/108)
La instrucci on de intercambio
Disponible en la pr actica totalidad de los procesadores. Permite crear un protocolo de secci on cr tica? si. Soluciona el problema de la portabilidad? si. instrucci on de intercambio void intercambiar(bool *a, bool *b) { bool t = *a; *a = *b; *b = *t; }
c Gustavo Romero
N ucleo
c Gustavo Romero
void se~ nalar() // v() { valor = valor + 1; if (valor <= 0) { desbloquear(bloq.sacar()); } } private: int valor; lista<hebra> bloq; };
c Gustavo Romero
c Gustavo Romero
Multiprocesador:
Emplear instrucciones at omicas: TAS, CAS, LL/SC,...
c Gustavo Romero Exclusi on mutua (67/108)
Qu e sucede al cambiar a otra hebra? Siguen las interrupciones deshabilitadas? 3 bloquear() = bloquear() + sti 4 desbloquear() = cli + desbloquear()
c Gustavo Romero Exclusi on mutua (68/108)
void se~ nalar() // v() { while(TAS(ocupado) == true); valor = valor + 1; if (valor <= 0) { desbloquear(bloq.sacar()); } ocupado = false;
c Gustavo Romero
c Gustavo Romero
variable global sem aforo s = 1; hebrai while(true) { s.esperar(); secci on cr tica(); s.se~ nalar(); secci on no cr tica(); }
void* productor(void*) { while(true) { elemento e = producir(); s.esperar(); b ufer[entra++] = e; s.se~ nalar(); n.se~ nalar(); } }
5 c Gustavo Romero
void* consumidor(void*) { while(true) { n.esperar(); // el orden s.esperar(); // importa elemento e = b ufer[sale++]; s.se~ nalar(); consumir(e); } }
void* consumidor(void*) { while(true) { elementos.esperar(); exclusi on.esperar(); elemento e = b ufer[sale]; sale = (sale + 1) % N; exclusi on.se~ nalar(); huecos.se~ nalar() consumir(e); } }
Exclusi on mutua (76/108)
Esta soluci on tiene efectos adversos muy serios sobre la arquitectura del sistema.
c Gustavo Romero
void depurador(hebra h) { bloquear(h); operaciones de depuraci on sobre h; desbloquear(h); } Conicto entre depurador y depurado: Doble bloquear() = uno es olvidado. desbloquear() en el depurador() viola la exclusi on mutua al permitir el acceso a su secci on cr tica a la hebra que ejecut o esperar(). desbloquear() en se~ nalar() viola el funcionamiento del depurador.
Exclusi on mutua (79/108)
Consecuencias:
la planicaci on y los sem aforos son operaciones fuertemente acopladas. Cualquier m etodo de sincronizaci on que utilice bloquear() y desbloquear() deber a tener en cuenta sus consecuencias sobre los sem aforos.
Todo m etodo de sincronizaci on, aunque l ogicamente independiente de la planicaci on, debe ser implementado en un u nico m odulo.
c Gustavo Romero Exclusi on mutua (80/108)
esperar(), se~ nalar(), depuraci on y planicaci on deben coexistir. Sin embargo el sistema podr a dejar de funcionar si no emparejamos de forma correcta las llamadas a bloquear() y desbloquear() soluci on no v alida. Intento 2: No transferir informaci on a trav es de desbloquear(). Transferir la informaci on acerca de quien posee el sem aforo de forma expl cita. Utilizar bloquear() y desbloquear() tan s olo como optimizaci on.
c Gustavo Romero Exclusi on mutua (81/108)
void esperar() { if (propietario == nadie) propietario = esta; else { cola.a~ nadir(esta); do private: bloquear(esta); volatile hebra propietario; while (propietario != esta); volatile cola<hebra> bloq; } };
c Gustavo Romero Exclusi on mutua (82/108)
Como reglas de dise no... Mantener independientes las cosas independientes. Evitar cualquier t ecnica que induzca efectos laterales.
Consecuencias: El dise no y la implementaci on de sem aforos requiere habilidad y visi on de futuro. Modicar las operaciones del n ucleo es justo lo contrario.
c Gustavo Romero
En resumen...
Los sem aforos son una herramienta de coordinaci on primitiva:
para garantizar la exclusi on mutua. para sincronizar hebras.
Las llamadas a esperar() y se~ nalar() suelen estar dispersas por varias hebras con lo que es dif cil comprender todos sus efectos. El uso debe ser correcto en todas estas las hebras. Una hebra defectuosa o maliciosa puede estropear el funcionamiento del resto. Algunos autores recomiendan evitar su uso = Qu e utilizar en su lugar? Existen mejores m etodos de sincronizaci on?
c Gustavo Romero Exclusi on mutua (84/108)
Monitores
Ofrecido en lenguajes de programaci on concurrente como Java, Modula-3, Pascal concurrente,... Internamente puede ser implementado mediante sem aforos u otros mecanismos de sincronizaci on.
c Gustavo Romero
Caracter sticas:
Las variables locales s olo son accesibles mediante los procedimientos del monitor. Una hebra entra en el monitor mediante la invocaci on de uno de sus procedimientos. S olo una hebra puede estar ejecutando alg un procedimiento del monitor los monitores proporcionan exclusi on mutua de forma autom atica.
c Gustavo Romero
Utilizaci on de un vector contiguo de N posiciones como b ufer circular. Interfaz con operaciones: recuperar() y depositar()
c Gustavo Romero
Exclusi on mutua autom atica entre hebras. Operaciones serializadas pero aun podemos depositar() sobre un b ufer lleno o recuperar() desde un b ufer vacio 2 restricciones m as.
c Gustavo Romero Exclusi on mutua (89/108)
Ya no podemos depositar sobre un b ufer lleno o recuperar desde un b ufer vacio pero... bloqueamos el monitor (*).
c Gustavo Romero Exclusi on mutua (90/108)
Variables condici on
Variables locales al monitor y s olo accesibles desde su interior mediante las operaciones: esperar(): Bloquea la ejecuci on de la hebra llamadora sobre la variable condici on. La hebra bloqueada s olo puede continuar su ejecuci on si otra ejecuta se~ nalar(). Antes de bloquearse libera el monitor. se~ nalar(): Reactiva la ejecuci on de alguna hebra bloqueada en la variable condici on. Si hay varias podemos escoger una cualquiera. Si no hay ninguna no hace nada.
c Gustavo Romero
Las hebras pueden estar esperando en la cola de entrada o en la de alguna variable de condici on. Una hebra se pone en la cola de espera al invocar esperar() sobre una variable de condici on. se~ nalar() permite a una hebra que estuviese bloqueada en la cola de una condici on continuar. se~ nalar() bloquea a la hebra llamadora y la pone en la cola urgente a menos que sea la u ltima operaci on del procedimiento (?).
c Gustavo Romero Exclusi on mutua (92/108)
void recuperar(elemento e) { while (contador == 0) no vacio.esperar(); e = b ufer[cabeza]; cabeza = (cabeza + 1) % N; contador = contador - 1; no lleno.se~ nalar(); } private: elemento b ufer[N]; int cabeza, cola, contador; variable_condici on no lleno, no vacio; };
productori while (true) { producir(e); depositar(e); } consumidori while (true) { recuperar(e); consumir(e); }
Exclusi on mutua (94/108)
productor consumidor
La sincronizaci on queda connada en el interior del monitor. depositar() y recuperar() son m etodos del monitor. Si estos m etodos se implementan correctamente cualquier hebra podr a utilizarlos para sincronizarse de forma correcta.
c Gustavo Romero
Si una hebra Hi ejecuta se~ nalar() mientras que otra, Hj , estaba bloqueada debido a una ejecuci on previa de esperar(), Cu al de las dos deber a continuar ejecut andose? estilos Hoare/Mesa. Un monitor deber a permanecer cerrado si alg un evento iniciado externamente ocurriese, por ejemplo el n del quantum asignado. De otra forma no podr amos garantizar la exclusi on mutua otra hebra podr a ejecutar el monitor. Qu e hacer si un m etodo de un monitor Mi invoca un m etodo de otro monitor Mj ?
c Gustavo Romero
Problemas
c Gustavo Romero
vida de un l osofo repetir { pensar estar hambriento coger tenedores comer soltar tenedores }
c Gustavo Romero
Para cada par de l osofos que compiten por un tenedor d arselo al de menor identicador. Cuando un l osofo quiere comer debe obtener los dos tenedores de sus vecinos. Por cada tenedor que no tenga debe enviar un mensaje para solicitarlo. Cuando un l osofo posee un tenedor y recibe una petici on pueden pasar dos cosas:
Despu es de comer los dos tenedores de un l osofo est an sucios. Si otro l osofo solicita alguno de ellos lo limpia y lo pasa. Cada tenedor puede estar limpio o sucio. Inicialmente todos los tenedores est an sucios. El sistema debe inicializarse de forma no perfectamente sim etrica, ej: todos los l osofos poseen el tenedor izquierdo.
c Gustavo Romero Exclusi on mutua (99/108)
Notas:
F2 comi o despu es de F1 , F3 comi o despu es de F2 , F4 comi o despu es de F3 y F1 comi o despu es de F4 = F1 comi o despu es de F1 = contradicci on. El interbloqueo es imposible
c Gustavo Romero
La inanici on es imposible.
c Gustavo Romero Exclusi on mutua (101/108)
c Gustavo Romero
Pthreads
c Gustavo Romero
c Gustavo Romero