Documentos de Académico
Documentos de Profesional
Documentos de Cultura
T Tema 3
T Tema 3
SEMÁFOROS
1. Introducción
2. Semáforos
3. Uso de los semáforos
3.1. Exclusión Mutua
3.2. Sincronización: Unidireccional y Bidireccional
3.3. Gestión de recursos múltiples
4. Solución para ejemplos típicos con semáforos
4.1. Productor - Consumidor
4.2. Lectores - Escritores
4.3. Filósofos
5. Solución a otros ejemplos
6. Análisis sobre semáforos
Semáforo (I)
q Atomicidad
Ø wait y signal deben realizarse de forma atómica; o sea,
sin que ningún otro proceso utilice el procesador
Ø Solución: Incluir una instrucción de bajo nivel
TEST_AND_SET: comprobar y asignar.
q Tipos
§ Binarios: 0 ó 1
§ Generales: 0 .. N
q Invariantes
§ a) S ³ 0
§ b) S = S0 + #Signal - #Wait
q Demostración
§ Existe exclusión Mutua
§ No existen interbloqueos
PROCESS P1;
VAR i: INTEGER;
BEGIN
FOR i:=1 TO 10 DO
BEGIN
WAIT(semaforo);
X:= X+1;
SIGNAL(semaforo)
END
END; (* P1 *)
PROCESS P2;
VAR i:INTEGER;
BEGIN
FOR i:=1 TO 10 DO
BEGIN
WAIT(semaforo);
X:= X + 1;
SIGNAL(semaforo)
END
END; (* P2 *)
BEGIN (* Principal *)
INITIAL(semaforo,1);
COBEGIN
p1; p2
COEND
END. (* excmutua*)
Semáforos: Sincronización
PROCESS productor;
BEGIN
REPEAT
producir;
wait(s); (* acceso exclusivo al buffer *)
dejar_en_buffer;
signal(s);
signal(elto); (* elemento en buffer *)
FOREVER
END; (* Productor *)
PROCESS consumidor;
BEGIN
REPEAT
wait(elto); (* Esperar elemento *)
wait(s); (* acceso exclusivo al buffer *) BEGIN (* PRINCIPAL *)
coger_del_buffer; initial(s,1);
signal(s); (* Fin de exclusión mutua *) initial(elto,0);
consumir; COBEGIN
FOREVER productor;
END; (* Consumidor *) consumidor
COEND;
END. (* PRINCIPAL *)
Semáforos: Productor-Consumidor (II)
q Productor-Consumidor buffer limitado (array)
PROGRAM ProdConsFin;
CONS
MAX = ... ; (* Cap. Buffer *)
TYPE
dato : ... ; (* Tipo de datos *)
VAR PROCESS consumidores;
buffer : array [1..MAX] of dato; VAR cdato : dato;
producir, consumir: semaphore; BEGIN
ps, cs: semaphore; REPEAT
ent, sal: integer; wait(consumir);
wait(cs);
PROCESS productores; cdato:= buffer[sal];
VAR pdato : dato; sal := (sal mod MAX) + 1;
BEGIN signal(cs);
REPEAT signal(producir);
wait(producir); consumir(cdato);
pdato := producir(); FOREVER
wait(ps); END; (* Consumidores *)
buffer[ent]:= pdato;
ent := (ent mod MAX) + 1; BEGIN (* PRINCIPAL *)
signal(ps); initial(ps,1);
signal(consumir); initial(cs,1);
FOREVER initial(consumir,0);
END; (* Productores *) initial(poducir,MAX);
ent:=1; sal:=1;
COBEGIN
productores;
consumidores
COEND;
END. (* PRINCIPAL *)
Semáforos: Lectores-Escritores
PROGRAM LectEscr;
VAR
nlect : integer;
s,escribir : semaphore;
PROCESS Lectores;
BEGIN
REPEAT
wait(s); (* Acceso exclusivo a variable *)
nlect := nlect + 1;
IF nlect = 1 THEN wait(escribir); (* Primer lector impide escritura *)
signal(s);
LEER;
wait(s); (* Acceso exclusivo a variable *)
nlect := nlect - 1;
IF nlect = 0 THEN signal(escribir); (* Último lector habilita escritura *)
signal(s);
FOREVER
END; (* Lectores *)
PROCESS Escritores;
BEGIN
REPEAT
wait(escribir); (* Espera escribir *) BEGIN (* PRINCIPAL *)
ESCRIBIR; nlect := 0;
signal(escribir); (* Permitir escribir *) initial(s,1);
FOREVER initial(escribir,1);
END; (* Escritores *) COBEGIN
lectores;
escritores
COEND
END. (* PRINCIPAL *)
Semáforos: Filósofos (I)
PROGRAM FilosofSem1;
CONST
N = 5;
VAR
palillo : array [1..N] of semaphore; (* Semáforo binario por palillo *)
i : integer;
PROGRAM FilosofSem2;
CONST
N = 5;
VAR
palillo : array [1..N] of semaphore; (* Semáforo binario por palillo *)
mesa : semaphore; (* Semáforo General para mesa *)
i : integer;
BEGIN (* PRINCIPAL *)
FOR i := 1 TO N DO
initial(palillo[I],1);
initial(mesa,N - 1); (* En la mesa pueden comer n-1 filosofos a la vez.*)
COBEGIN
FOR i := 1 TO N DO
filosofos(I);
COEND
END.
Semáforos: Análisis.
q Ventajas
§ Simples
§ Eficientes
§ Poderosos
q Problemas
§ No estructurados. El uso depende del programador
Omitir un wait Þ Falta de Exclusión
Omitir un Signal Þ Interbloqueo