Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
octubre de 2006
Fernando Cuartero
Exclusin Mutua
Problema planteado por Edsgar Dijkstra en 1968 Consiste en dos (o ms) procesos en concurrencia Cada uno ejecuta una seccin no crtica (puede ser en paralelo). Cada uno ejecuta una seccin crtica (no puede ser en paralelo) El problema consiste en garantizar que las respectivas secciones crticas se ejecutan por separado (en exclusin mutua)
octubre de 2006
Fernando Cuartero
Exclusin Mutua
Ejemplo
Exclusin Mutua
Esquema general
PROCESO 1 parbegin repeat seccin no crtica 1 entrada protocolo seccin crtica 1 salida protocolo forever parend PROCESO 2 parbegin repeat seccin no crtica 2 entrada protocolo seccin crtica 2 salida protocolo forever parend
Exclusin mutua
Propiedades que debe satisfacer el protocolo Seguridad Vivacidad
octubre de 2006
Fernando Cuartero
Seguridad
Nada incorrecto puede suceder Exclusin mutua Las condiciones de exclusin mutua deben ser satisfechas Deadlock No debe ocurrir una situacin de bloqueo Sincronizacin Deben cumplirse las condiciones impuestas
octubre de 2006 Fernando Cuartero 6
Vivacidad
Algo correcto debe suceder Starvation Todas las peticiones deben ser satisfechas
En ausencia de contencin Cuando un proceso pretende entrar en seccin crtica, y no lo consigue aunque no haya otros procesos en competencia (bloqueo activo o livelock) En presencia de contencin Cuando un proceso pretende entrar en seccin crtica, y no lo consigue porque otros procesos siempre se adelantan
Busy Waiting
Consiste en establecer los protocolos de entrada a la seccin crtica mediante bucles de espera ocupada.
PROCESO 1 parbegin repeat seccin no crtica 1 espera hasta cond 1 seccin crtica 1 fin seccin critica forever parend
PROCESO 2 parbegin repeat seccin no crtica 2 espera hasta cond 2 seccin crtica 2 fin seccin critica forever parend
octubre de 2006
Fernando Cuartero
Busy Waiting
PRIMER INTENTO
procedure First is Turn: Integer := 1; end First; task body T1 is task body T2 is begin begin loop loop Put_Line("Task 1 en espera"); Put_Line("Task 2 en espera"); loop exit when Turn = 1; end loop; loop exit when Turn = 2; end loop; Put_Line("Task 1 seccin crtica"); Put_Line("Task 2 seccin crtica"); Turn := 2; Turn := 1; end loop; end loop; end T1 end T2;
octubre de 2006 Fernando Cuartero 9
Busy Waiting
PRIMER INTENTO La La La La solucin solucin solucin solucin satisface la exclusin mutua no produce deadlock no produce starvation puede fallar. Ejemplo
La solucin no es adecuada si los dos procesos tienen diferentes velocidades relativas de ejecucin
octubre de 2006 Fernando Cuartero 10
Busy Waiting
SEGUNDO INTENTO
procedure Second is C1, C2: Integer := 1; end Second; task body T1 is task body T2 is begin begin loop loop Put_Line("Task 1 en espera"); Put_Line("Task 2 en espera"); loop exit when C2 /= 0; end loop; loop exit when C1 /= 0; end loop; Put_Line("Task 1 entra en seccin crtica"); Put_Line("Task 2 entra en seccin crtica"); C1 := 0; C2 := 0; Put_Line("Task 1 en seccin crtica"); Put_Line("Task 2 en seccin crtica "); C1 := 1; C2 := 1; end loop; end loop; end T1; end T2;
octubre de 2006 Fernando Cuartero 11
Busy Waiting
SEGUNDO INTENTO La solucin NO satisface la exclusin mutua
P1 comprueba C2. Vale C2 = 1 P2 comprueba C1. Vale C1 = 1 P1 pone C1 a 0 P2 pone C2 a 0 P1 entra en la seccin crtica P2 entra en la seccin crtica
octubre de 2006
Fernando Cuartero
12
Busy Waiting
TERCER INTENTO
procedure Third is C1, C2: Integer := 1; end Third; task body T1 is task T2; begin task body T2 is loop begin Put_Line("Task 1 en espera"); loop C1 := 0; Put_Line("Task 2 en espera"); loop exit when C2 /= 0; end loop; C2 := 0; Put_Line("Task 1 en seccin crtica"); loop exit when C1 /= 0; end loop; C1 := 1; Put_Line("Task 2 en seccin crtica"); end loop; C2 := 1; end T1; end loop; end T2;
octubre de 2006 Fernando Cuartero 13
Busy Waiting
TERCER INTENTO La solucin satisface la exclusin mutua La solucin puede producir deadlock
P1 asigna 0 a C1 P2 asigna 0 a C2 P1 chequea C2 y contina en el bucle P2 chequea C1 y contina en el bucle ... Y as sucesivamente
octubre de 2006
Fernando Cuartero
14
Busy Waiting
CUARTO INTENTO
procedure Fourth is C1, C2: Integer := 1; end Fourth;
task body T1 is task body T2 is begin begin loop loop Put_Line("Task 1 en espera"); C1 := 0; Put_Line("Task 2 en espera "); C2 := 0; loop loop exit when C2 /= 0; exit when C1 /= 0; C1 := 1; C2 := 1; Put_Line("Task 1 inicia variable"); Put_Line("Task 2 inicia variable"); C1 := 0; C2 := 0; end loop; end loop; Put_Line("Task 1 en seccin crtica"); Put_Line("Task 2 en seccin crtica"); C1 := 1; C2 := 1; end loop; end loop; end T1; end T2; octubre de 2006 Fernando Cuartero 15
Busy Waiting
CUARTO INTENTO La solucin satisface la exclusin mutua La solucin puede producir starvation sin contencin, y bloqueo activo
P1 asigna 0 a C1 P2 asigna 0 a C2 P1 chequea C2 y pone C2 a 0 P1 completa un bucle P1 chequea C2 Entra en seccin crtica Pone C1 a 1 Ejecuta la seccin no crtica Pone C1 a 0 P2 pone C2 a 0 ... Se alcanza el estado de la lnea 3
octubre de 2006 Fernando Cuartero 16
Busy Waiting
ALGORTIMO DE DEKKER (1)
procedure Dekker is C1, C2: Integer := 1; Turn: Integer := 1; task T1; task T2; begin null; end Dekker;
octubre de 2006
Fernando Cuartero
17
Busy Waiting
ALGORTIMO DE DEKKER (2)
task body T1 is task body T2 is begin begin loop loop Put_Line("Tarea 1 en espera"); C1 := 0; Put_Line("Tarea 2 en espera"); C2 := 0; loop loop exit when C2 /= 0; exit when C1 /= 0; if Turn = 2 then if Turn = 1 then C1 := 1; Put_Line(T1 inicia variable"); C2 := 1; Put_Line("T2 inicia variable"); loop exit when Turn /= 2; end loop; loop exit when Turn /= 1; end loop; C1 := 0; C2 := 0; end if; end if; end loop; end loop; Put_Line("Tarea 1 en seccin crtica"); Put_Line("Tarea 2 en seccin crtica"); Turn := 2; C1 := 1; Turn := 1; C2 := 1; end loop; end loop; end T1; end T2;
octubre de 2006 Fernando Cuartero 18
Busy Waiting
ALGORITMO DE DEKKER Elementos clave Cada proceso tiene una bandera para declarar su intencin de entrar en seccin crtica Se espera ANTES de la seccin crtica hasta que se est preparado para entrar Se traslada el turno (preferencia) una vez ejecutada la seccin crtica Para evitar el livelock slo el proceso contrario puede actualizar el turno propio
octubre de 2006 Fernando Cuartero 19
Busy Waiting
ALGORITMO DE DEKKER La La La La La solucin solucin solucin solucin solucin satisface la exclusin mutua no produce deadlock NO puede producir starvation si es adecuada para 2 procesos no es adecuada para n procesos
octubre de 2006
Fernando Cuartero
20
Busy Waiting
ALGORITMO DE PETERSON
procedure Peterson is C1, C2: Integer := 1; Last: Integer := 1; end Peterson; task body T1 is task body T2 is begin begin loop loop Put_Line("Tarea 1 en espera"); Put_Line("Tarea 2 en espera"); C1 := 1; Last := 1; C2 := 1; Last := 2; Put_Line("Tarea 1 intenta entrar"); Put_Line("Tarea 2 intenta entrar"); loop exit when C2 = 0 or Last /= 1; end loop; loop exit when C1 = 0 or Last /= 2; end loop; Put_Line("Tarea 1 en seccin critica"); Put_Line("Tarea 2 en seccin critica"); C1 := 0; C2 := 0; end loop; end loop; end T1; end T2;
octubre de 2006
Fernando Cuartero
21
Busy Waiting
ALGORITMO DE PETERSON La solucin satisface la exclusin mutua La solucin no produce deadlock La solucin no produce starvation La solucin es adecuada El algoritmo de Peterson sirve para 2 procesos, pero no es fcilmente generalizable a N procesos
octubre de 2006
Fernando Cuartero
22
Busy Waiting
ALGORITMO DE LA PANADERIA
Enter, Ticket: array [1..N] of integer = {0}; Proceso (i) while true Enter[i] = 1; // Una guarda para solicitar el ticket Ticket [i] = 1 + max(Ticket[1], ..., Ticket[N]); Enter[i] = 0; for j := 1 to N loop while (Enter[j] <> 0) do null // Si el proceso j est pidiendo ticket, espera hasta que lo tenga while ((Ticket[j] <> 0) and ((Ticket[j], j) < (Ticket[i], i))) do null // Espera hasta que los procesos con ticket menor finalicen el trabajo // NOTA: Si dos procesos reciben el mismo ticket se usa su identificador // Seccin Crtica ... Ticket[i] = 0; // Seccin no Crtica ...
octubre de 2006 Fernando Cuartero 23
Busy Waiting
ALGORITMO DE LA PANADERIA (LAMPORT) Elementos clave Se asignan los turnos (preferencias) mediante un sistema de tickets que garantice que cada proceso recibe su atencin en el orden correspondiente La comparacin (a,b) < (c,d) compara el primer trmino, y en caso de igualdad el segundo El algoritmo no puede garantizar que dos procesos no reciban el mismo ticket, en ese caso, el proceso de menor nmero se considera ganador
octubre de 2006 Fernando Cuartero 24
Busy Waiting
ALGORITMO DE LA PANADERIA La solucin satisface la exclusin mutua La solucin no produce deadlock La solucin no produce starvation La solucin es adecuada El algoritmo de la panadera es fcilmente generalizable a N procesos
octubre de 2006
Fernando Cuartero
25
Busy Waiting
COMPARATIVA
Intento Primero Segundo Tercero Cuarto Dekker Peterson Asegura Deadlock E.M. si no si si si si no si si si si no si si si si si si si no si si si si Livelock Starvation Con conten. si si Starvation Sin conten. si
Panadera si
octubre de 2006
Fernando Cuartero
26
Busy Waiting
CONCLUSIONES La solucin basada en espera activa satisface la exclusin mutua, junto con las condiciones deseadas Una solucin basada en espera activa es, por definicin, una MALA SOLUCIN Es necesario recurrir a mecanismos basados en hardware, no slo a mecanismos de programacin secuencial pasados a concurrente
octubre de 2006
Fernando Cuartero
27