Sei sulla pagina 1di 27

Programacin Concurrente

El problema de la exclusin mutua

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

No hay garantas del orden de ejecucin de las rdenes


octubre de 2006 Fernando Cuartero 3

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

El problema consiste en definir los protocolos


octubre de 2006 Fernando Cuartero 4

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

Fairness (equidad) Los conflictos deben resolverse equitativamente


octubre de 2006 Fernando Cuartero 7

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

P2 para en la seccin no crtica El valor de Turn no es actualizado P1 nunca vuelve a ejecutarse

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

Potrebbero piacerti anche