Problemas Clasicos de Comunicacion y Sincronizacion PDF
Problemas Clasicos de Comunicacion y Sincronizacion PDF
Problemas Clasicos de Comunicacion y Sincronizacion PDF
Tema 4
Analizar las condiciones de carrera y estudiar el concepto de seriabilidad. Estudiar, en el caso de memoria comn, el problema de la seccin critica. Presentar los criterios de correccin al problema de la seccin critica y sus posibles soluciones de una forma estructurada:
Soluciones hardware Semforos Realizacin de semforos mediante soluciones hardware.
Adquirir destreza en la resolucin de problemas de sincronizacin a travs de problemas clsicos (productores y consumidores, lectores y escritores, cinco filsofos, etc.)
Sistemas Operativos I (00-01) Comunicacin y sincronizacin de Procesos 2
1.Introduccin
Existe la necesidad de comunicacin entre procesos. Los procesos requieren con frecuencia comunicacin entre ellos (ejemplo: tubos). La comunicacin entre procesos puede seguir dos esquemas bsicos: Comunicacin por memoria comn Comunicacin por mensajes
1.Introduccin
Comunicacin por memoria comn La comunicacin por memoria comn se puede dar en los siguientes casos:
Espacio de direcciones nico: es el caso de los hilos de ejecucin El s.o. crea una zona de memoria accesible a un grupo de procesos
P1
Hilo 1
Hilo 2
Problema de la seccin crtica: en un sistema con procesos concurrentes que se comunican compartiendo datos comunes es necesario sincronizar el acceso (lectura, escritura) a los datos compartidos para asegurar la consistencia de los mismos.
Datos compartidos
1.Introduccin
Comunicacin por mensajes La comunicacin por mensajes se da normalmente en el siguiente caso:
Espacio de direcciones independentes
Sincronizacin en la comunicacin por mensajes: Cuando dos procesos se comunican va mensajes se necesitan mecanismos para que el proceso receptor espere (se suspenda hasta) a que el proceso emisor enve el mensaje y ste est disponible. No aparece el problema de la seccin crtica.
P1
mensaje
P2
C1 salida
C2
Consumidores
buffer
10
proceso proceso consumidor: consumidor: task ;; task consumidor consumidor var item: elemento; var item: elemento; repeat repeat while while contador= contador= 0 0 do do no-op; no-op; item item := := buffer[salida] buffer[salida] salida salida := := (salida (salida +1) +1) mod mod n; n; contador:=contador-1; contador:=contador-1; consumir(item); consumir(item); until until false false end end consumidor; consumidor;
11
12
Consumidor: contador:= contador-1; mov movreg2, reg2,contador; contador; dec reg2; dec reg2; mov movcontador, contador,reg2; reg2;
reg1 reg2 5 6 ? ? ? 6 ? ? 5 4 4 ? contador 5 5 5 5 4 6
incorrecto
13
Condicin de carrera = no seriabilidad: no hay ninguna posible ejecucin secuencial de un conjunto de operaciones que de el mismo resultado que la ejecucin concurrente.
14
Ejemplo numrico: sea una variable x con valor inicial 3 sobre la que se pueden realizar dos operaciones:
op1: incremento de 8 op2: multiplicacin por 5
16
17
18
Exclusin mtua: si un proceso est ejecutando su seccin crtica ningn otro proceso puede estar ejecutando la suya. Progreso: si ningn proceso est ejecutando su seccin crtica y hay otros que desean entrar a las suyas, entonces la decisin de qu proceso entrar a la seccin crtica se toma en un tiempo finito y slo puede ser seleccionado uno de los procesos que desean entrar. Espera limitada: Despus de que un proceso haya solicitado entrar en su seccin crtica, existe un lmite en el nmero de veces que se permite que otros procesos entren a sus secciones crticas.
19
20
10
task Pj;
while turno <> j do no-op; seccin CRTICA turno := i; seccin RESTANTE end Pj;
22
11
4. Soluciones hardware
Soluciones hardware al problema de la seccin crtica Las soluciones hardware son soluciones a nivel de instrucciones del lenguaje mquina: Deshabilitacin de interrupciones Instruccin test_and_set atmica (indivisible). Instruccin swap atmica.
23
4. Soluciones hardware
Deshabilitacin de interrupciones La deshabilitacin de interrupciones se realiza utilizando las instrucciones:
DI : Deshabilitar interrupciones EI : Habilitar interrupciones
Se consigue la exclusin mtua inhibiendo los cambios de contexto durante la seccin crtica, obligando as a que los procesos se ejecuten de manera atmica. Solucin nicamente viable al nivel del ncleo del sistema operativo: puesto que no es deseable dejar el control de las interrupciones en manos de los procesos de usuario. Las instrucciones DI y EI slo se pueden ejecutar en modo privilegiado. DI DI seccin seccinCRTICA CRTICA EI EI seccin seccinRESTANTE RESTANTE
Sistemas Operativos I (00-01) Comunicacin y sincronizacin de Procesos 24
12
4. Soluciones hardware
Operacin test and set atmica
La operacin test_and_set permite evaluar y modificar una variable atmicamente en una sola operacin de ensamblador. La especificacin funcional de esta operacin es:
function var functiontestAndSet( testAndSet( varobjetivo: objetivo:boolean): boolean):boolean; boolean; begin begin testAndSet testAndSet:= :=objetivo; objetivo; objetivo := TRUE; objetivo := TRUE; end end atmicamente!
25
4. Soluciones hardware
Solucin al problema de la s.c. con test_and_set Variables compartidas: var ;; varllave llave:= :=FALSE FALSE::boolean boolean task taskPi; Pi;
26
13
4. Soluciones hardware
Solucin a la s.c. con test and set y espera limitada La solucin anterior no satisface el requisito de la espera limitada. Variables compartidas: var [0..n-1] varesperando esperando:= :=FALSE FALSE::array array [0..n-1]of ofboolean; boolean; cerradura cerradura:= :=FALSE FALSE::boolean; boolean;
27
4. Soluciones hardware
Solucin a la s.c. con test and set y espera limitada task Algoritmo del proceso i: taskPi; Pi; var j: 0..n-1; var j: 0..n-1; llave: llave:boolean; boolean; ... ... esperando[i]:= esperando[i]:=TRUE; TRUE; llave llave:= :=TRUE; TRUE; while whileesperando[i] esperando[i]and andllave llavedo dollave:=testAndSet(cerradura); llave:=testAndSet(cerradura); esperando[i] esperando[i]:= :=FALSE; FALSE; seccin seccinCRTICA CRTICA j:=i+1 mod n; j:=i+1 mod n; while not while(j<>i) (j<>i)and and(( notesperando[j]) esperando[j])do doj:=j+1 j:=j+1mod modn; n; if j=i then cerradura := FALSE else esperando[j] if j=i then cerradura := FALSE else esperando[j]:= :=FALSE; FALSE; seccin seccinRESTANTE RESTANTE end endPi; Pi;
28
14
4. Soluciones hardware
Solucin a la s.c. con test and set y espera limitada
Proceso 0 (i=0)
esperando[i]:= TRUE; llave := TRUE; while esperando[i] and llave do llave:=testAndSet(cerradura); esperando[i] := FALSE;
cerradura
esperando
j:=i+1 mod n; while (j<>i) and (not esperando[j]) do j:=j+1 mod n; if j=i then cerradura := FALSE else esperando[j] := FALSE;
F F F F F F F F
0 1 2 3 4 5 6 7 ...
29
4. Soluciones hardware
Solucin a la s.c. con test and set y espera limitada
Proceso 0 (i=0)
esperando[i]:= TRUE; llave := TRUE; while esperando[i] and llave do llave:=testAndSet(cerradura); esperando[i] := FALSE;
cerradura
esperando
j:=i+1 mod n; while (j<>i) and (not esperando[j]) do j:=j+1 mod n; if j=i then cerradura := FALSE else esperando[j] := FALSE;
V F F F F F F F
0 1 2 3 4 5 6 7 ...
30
15
4. Soluciones hardware
Solucin a la s.c. con test and set y espera limitada
Proceso 0 (i=0)
esperando[i]:= TRUE; llave := TRUE; while esperando[i] and llave do llave:=testAndSet(cerradura); esperando[i] := FALSE;
cerradura
esperando
j:=i+1 mod n; while (j<>i) and (not esperando[j]) do j:=j+1 mod n; if j=i then cerradura := FALSE else esperando[j] := FALSE;
V F F F F F F F
0 1 2 3 4 5 6 7 ...
31
4. Soluciones hardware
Solucin a la s.c. con test and set y espera limitada
Proceso 0 (i=0)
esperando[i]:= TRUE; llave := TRUE; while esperando[i] and llave do llave:=testAndSet(cerradura); esperando[i] := FALSE;
cerradura
esperando
j:=i+1 mod n; while (j<>i) and (not esperando[j]) do j:=j+1 mod n; if j=i then cerradura := FALSE else esperando[j] := FALSE;
F F F F F F F F
0 1 2 3 4 5 6 7 ...
32
16
4. Soluciones hardware
Solucin a la s.c. con test and set y espera limitada
Proceso 0 (i=0)
esperando[i]:= TRUE; llave := TRUE; while esperando[i] and llave do llave:=testAndSet(cerradura); esperando[i] := FALSE;
cerradura
esperando
j:=i+1 mod n; while (j<>i) and (not esperando[j]) do j:=j+1 mod n; if j=i then cerradura := FALSE else esperando[j] := FALSE;
F F F F V F F F
0 1 2 3 4 5 6 7 ...
33
4. Soluciones hardware
Solucin a la s.c. con test and set y espera limitada
Proceso 0 (i=0)
esperando[i]:= TRUE; llave := TRUE; while esperando[i] and llave do llave:=testAndSet(cerradura); esperando[i] := FALSE;
cerradura
esperando
j:=i+1 mod n; while (j<>i) and (not esperando[j]) do j:=j+1 mod n; if j=i then cerradura := FALSE else esperando[j] := FALSE;
F F F F V F F F
0 1 2 3 4 5 6 7 ...
34
17
4. Soluciones hardware
Solucin a la s.c. con test and set y espera limitada
Proceso 0 (i=0)
esperando[i]:= TRUE; llave := TRUE; while esperando[i] and llave do llave:=testAndSet(cerradura); esperando[i] := FALSE;
cerradura
esperando
j:=i+1 mod n; while (j<>i) and (not esperando[j]) do j:=j+1 mod n; if j=i then cerradura := FALSE else esperando[j] := FALSE;
F F F F V F F F
0 1 2 3 4 5 6 7 ...
35
4. Soluciones hardware
Solucin a la s.c. con test and set y espera limitada
Proceso 0 (i=0)
esperando[i]:= TRUE; llave := TRUE; while esperando[i] and llave do llave:=testAndSet(cerradura); esperando[i] := FALSE;
cerradura
esperando
j:=i+1 mod n; while (j<>i) and (not esperando[j]) do j:=j+1 mod n; if j=i then cerradura := FALSE else esperando[j] := FALSE;
F F F F F F F F
0 1 2 3 4 5 6 7 ...
36
18
4. Soluciones hardware
Solucin a la s.c. con test and set y espera limitada
Proceso 0 (i=0)
esperando[i]:= TRUE; llave := TRUE; while esperando[i] and llave do llave:=testAndSet(cerradura); esperando[i] := FALSE;
cerradura
esperando
j:=i+1 mod n; while (j<>i) and (not esperando[j]) do j:=j+1 mod n; if j=i then cerradura := FALSE else esperando[j] := FALSE;
F F F F F F F F
0 1 2 3 4 5 6 7 ...
37
4. Soluciones hardware
Solucin a la s.c. con test and set y espera limitada
Proceso 0 (i=0)
esperando[i]:= TRUE; llave := TRUE; while esperando[i] and llave do llave:=testAndSet(cerradura); esperando[i] := FALSE;
cerradura
esperando
j:=i+1 mod n; while (j<>i) and (not esperando[j]) do j:=j+1 mod n; if j=i then cerradura := FALSE else esperando[j] := FALSE;
F F F F F F F F
0 1 2 3 4 5 6 7 ...
38
19
4. Soluciones hardware
Operacin swap atmica
La operacin swap permite intercambiar atmicamente dos variables en una sola operacin de ensamblador. La especificacin funcional de esta operacin es:
function var functionswap( swap( vara,b: a,b:boolean); boolean); var temp : boolean; var temp : boolean; begin begin temp:= temp:=a; a; a:=b; a:=b; b b:= :=temp; temp; end end atmicamente!
39
4. Soluciones hardware
Solucin a la s.c con swap Variables compartidas:
var ;; varcerradura cerradura:= :=FALSE FALSE::boolean boolean
Espera activa
task taskPi; Pi; var varllave: llave:boolean; boolean; llave llave:= :=TRUE TRUE while whileswap(cerradura, swap(cerradura,llave) llave)until untilllave llave= =FALSE; FALSE; seccin seccinCRTICA CRTICA cerradura cerradura:= :=FALSE; FALSE; seccin seccinRESTANTE RESTANTE end endPi; Pi;
40
20
41
5. Semforos
Definicin de semforo Tipo de datos que toma valores enteros y sobre el que se definen las siguientes operaciones atmicas: S: semaforo(N); P(S) S:=S-1; if S<0 then esperar(S); V(S) S:=S+1; if S<=0 then despertar(S); La operacin esperar(S) suspende al proceso que ha invocado P() y lo introduce en una cola de espera asociada a S. La operacin despertar(S) extrae un proceso de la cola de espera asociada a S y lo activa.
Sistemas Operativos I (00-01) Comunicacin y sincronizacin de Procesos
atmicamente!
Semforo
P V
contador cola
42
21
5. Semforos
Solucin al problema de la seccin crtica con semforos
Los semforos son un mecanismo de sincronizacin que no requiere espera activa
Variables compartidas: var varmutex: mutex:semaforo(1); semaforo(1); task taskPi; Pi; (* (*valor valorinicial inicial1 1*) *)
... ... P (mutex); P (mutex); seccin seccinCRTICA CRTICA V (mutex); V(mutex); seccin seccinRESTANTE RESTANTE ... ...
end endPi; Pi;
43
5. Semforos
Implementacin de semforos
ESTRUCTURAS DE CONTROL DEL SISTEMA : Vector de semforos
Tabla de procesos
Semforo-i
Contador Cola de procesos esperando en el semforo i
P. primero
PCB 8
P. ltimo
PCB 4
PCB 2
44
22
P(S)
V(S)
Guardar parte del contexto de usuario, para realizar cambio de modo de ejecucin (usuario->ncleo)
S.contador:= S.contador-1; Si S. contador < 0 entonces Pasar a suspendido al proceso en ejecucin; Si S.contador Insertarlo en S.cola; Si no
S.contador:= S.contador+1; Si S.contador <= 0 entonces p:=extraer proceso de S.cola; Pasar p a preparado
Si no
Realizar cambio de modo de ejecucin (ncleo -> usuario). Recuperar contexto de usuario.
45
5. Semforos
Semforos versus espera activa
Espera activa:
El proceso que espera entrar en la seccin crtica desaprovecha el tiempo de CPU comprobando cuando puede entrar (ejecutando las instrucciones del protocolo de entrada).
Semforos:
La espera se realiza en la cola del semforo, que es una cola de procesos suspendidos. El proceso que espera entrar en la seccin crtica no utiliza CPU; est suspendido.
Proceso:
EntrdaSC; SeccinCrtica; SalidaSC; P1,P2,P2:Proceso; Duracin se la seccin crtica 2q
Espera activa
Espera activa
P1 P2 P3 P1 P2 P3 P2 P3 P3 q
Espera pasiva
P1 P1 P2 P2 P3 P3
46
23
5. Semforos
Semforos: ejemplos de utilizacin Un semforo es un mecanismo de sincronizacin de uso general: Para conseguir exclusin mtua. Para forzar relaciones de precedencia, como por ejemplo: El proceso Pj debe ejecutar B despus de que el proceso Pi haya ejecutado A. var sinc: semaforo(0); task Pi; ... A; V(sinc); ... task Pj; ... P(sinc) B; ...
47
5. Semforos
Semforos: problemas derivados de una utilizacin incorrecta Interbloqueos: Hay un conjunto de procesos en el que todos esperan (indefinidamente) un evento que slo otro proceso del conjunto puede producir. Ejemplo:
var s1: semaforo(1); s2: semaforo(1); task P1; ... P(s1); P(s2); V(s1); V(s2); task P2; ... P(s2); P(s1); V(s1); V(s2);
Escenario: Escenario: P1 P1 P(s1); P(s1); P2 P(s2); P2 P(s2); P2 P2 P(s1); P(s1); P1 P(s2); P1 P(s2); Sistema Sistemaen ensituacin situacin de interbloqueo de interbloqueo
48
24
49
50
25
C1 salida
C2
Consumidores
buffer
51
var ::array[0..n-1] varbuffer buffer array[0..n-1]of ofelemento; elemento; entrada:=0, ;; entrada:=0,salida:=0, salida:=0,contador:= contador:=0 0::0..n-1 0..n-1 lleno: ::semaforo(1); lleno:semaforo(0); semaforo(0); vacio: vacio:semaforo(n), semaforo(n), mutex mutex semaforo(1);
52
26
repeat repeat item item:= :=producir(); producir(); P (vacio); P (vacio); P (mutex); P (mutex);
buffer[entrada] buffer[entrada]:= :=item; item; entrada := (entrada entrada := (entrada+1) +1)mod modn; n;
salida salida:= :=(salida (salida+1) +1)mod modn; n; contador:=contador-1; contador:=contador-1; V (mutex); V (mutex); V (vacio); V (vacio); consumir(item); consumir(item);
53
54
27
L L
L L
STOP
STOP
E L
E L
E
STOP
55
56
28
STOP
E L
E
1 variante
2 variante
STOP
57
Variables compartidas:
var varmutex: mutex:semaforo(1); semaforo(1); esc escsemaforo(1); semaforo(1); nlectores:=0 nlectores:=0::integer; integer;
task taskescritor; escritor; P (esc); P (esc); escribir(); escribir(); V (esc); V(esc); end endescritor; escritor;
task tasklector; lector; P (mutex); P (mutex); nlectores nlectores:= :=nlectores nlectores+ +1; 1; if nlectores = 1 then P (esc); if nlectores = 1 then P (esc); V (mutex); V (mutex); leer(); leer(); P (mutex); P(mutex); nlectores nlectores:= :=nlectores nlectores--1; 1; if nlectores = (esc); if nlectores =0 0then thenV V (esc); V (mutex); V (mutex); end endlector; lector;
58
29
59
7. Construcciones lingsticas
Con el fin de simplificar la programacin de aplicaciones concurrentes, algunos lenguajes de programacin proporcionan herramientas (construcciones lingsticas) que facilitan la sincronizacin entre las tareas y proporcionan un modelo de programacin uniforme. Monitores Tipos protegidos en ADA Mtodos synchronized en Java
Soluciones a nivel de lenguaje de programacin Soluciones a nivel de sistema operativo Soluciones hardware
60
30
7.1 Monitores
Concepto Un monitor es un tipo de datos que encapsula datos y operaciones. Proporciona: Exclusin mtua. Sincronizacin.
61
7.1 Monitores
Sintaxis:
type nombre_monitor = monitor
Variables :: Variablesinternas internasal almonitor monitor Variables compartidas Variables compartidas Variables Variablescondicin condicin Mtodos Mtodosde deacceso: acceso: Unica Unicava vade deacceso accesoaalas las variables variablescompartidas compartidas Exclusin Exclusinmutua mutua
Se Seinvoca invocaautomticamente automticamenteal al instanciar el instanciar elmonitor monitoryyantes antes de deser seraccedido accedidopor porningn ningn proceso proceso Se Seutiliza utilizapara parala lainicializacin inicializacin de las variables de las variablesdel delmonitor monitor
62
31
7.1 Monitores
Variables de tipo condicin: Para definir esquemas complejos de sincronizacin, se pueden definir las variables del tipo condition. var x: condition; Sobre las variables condition se pueden realizar las siguientes operaciones: x.wait; Causa la suspensin (en una cola asociada a x) del proceso que invoc la operacin. x.signal; Se reanuda (si existe) un proceso suspendido en la cola asociada a x. x.awaited; Indica el nmero de procesos suspendidos en la cola asociada a x.
63
7.1 Monitores
Productores-consumidores con monitores
Monitor
PROGRAMA PRINCIPAL
B:buffer_limitado ;; B:buffer_limitado taskProductor; Productor; task var : elemento:item; var: elemento:item; repeat repeat ....Producirun unelemento elemento ....Producir B.insertar(elemento); B.insertar(elemento); untilfalse; false; until end Productor; end Productor;
taskConsumidor; Consumidor; task var elemento:item; var ::elemento:item; repeat repeat B.extraer(elemento); B.extraer(elemento); ....Procesarelemento elemento ....Procesar untilfalse; false; until endConsumidor; Consumidor; end
64
32
procedure entry insertar (elem:item); begin if cont=n then lleno.wait; cont:=cont+1; buffer[entrada]:=item; entrada:=(entrada + 1) mod n; vacio.signal; end;
procedure entry extraer(var elem:item); begin if cont=0 then vacio.wait; cont:=cont-1; item:=buffer[salida]; salida :=(salida + 1) mod n; lleno.signal; end;
65
7.1Monitores
Variantes Existen diferentes variantes en la definicin de un monitor segn resuelvan el siguiente problema: Un proceso P ejecuta x.signal y activa a otro proceso Q, Potencialmente P y Q pueden continuar su ejecucin dentro del monitor. Cmo se garantiza la ejecucin en exclusin mutua en el monitor? Modelo de Hoare: El proceso que invoca la operacin x.signal (P) se suspende (en una cola de urgencia) de forma que el proceso reanudado por la operacin x.signal (Q) pasa a ejecutarse dentro del monitor. Modelo de Lampson y Redell: El proceso P contina ejecutndose y Q se ejecutar cuando el monitor quede libre. Modelo de Brinch-Hansen: La operacin x.signal ha de ser la ltima operacin que un proceso invoca antes de salir del monitor.
66
33
7.1 Monitores
Modelo de colas
Cola de entrada
MONITOR
Variable condicin c1 Zona de espera del monitor (procesos suspendidos)
c1.wait c1.signal c2.wait c2.signal
Variable condicin c2
Datos
Procedimientos y funciones
Salida
67
7.1 Monitores
Implementacin de monitores con semforos Variables globales, por cada monitor se definen: var ::semaforo (1); varmutex mutex semaforo (1); urgente : semaforo (0); urgente: semaforo (0);(*cola (*colade deurgencia*) urgencia*) cont_urg : integer:=0; cont_urg: integer:=0;
Para cada procedimiento o funcion F, se genera: P(mutex); P(mutex); ..... .....Cuerpo Cuerpode deF; F; if cont_urg > if cont_urg >0 0 then thenV(urgente) V(urgente) else elseV(mutex); V(mutex);
68
34
7.1 Monitores
Implementacin de monitores con semforos Para cada variable condicin X, se define: var ::semaforo (0); var x_sem x_sem semaforo (0); x_cont ::integer:=0; x_cont integer:=0;
Operacin X.wait
x_cont:= x_cont:=x_cont+1; x_cont+1; if ifcont_urg cont_urg> >0 0 then V(urgente) then V(urgente) else elseV(mutex); V(mutex); P(x_sem); P(x_sem); x_cont:= x_cont:=x_cont-1; x_cont-1;
Operacin X.signal
if ifx_cont x_cont> >0 0 then begin then begin cont_urg:= cont_urg:=cont_urg cont_urg+ +1; 1; V(x_sem); V(x_sem); P(urgente); P(urgente); cont_urg:= cont_urg:=cont_urg cont_urg--1; 1; end ; end;
69
7.1 Monitores
Lectores-escritores con monitores
Monitor
PROGRAMA PRINCIPAL
varle:le-control; le:le-control; var var varle:le-control; le:le-control; tasklector(); lector(); task begin begin repeat repeat le.pre-leer(); le.pre-leer(); leer(); leer(); le.post-leer(); le.post-leer(); untilfalse; false; until endlector; lector; end
taskescritor(); escritor(); task begin begin repeat repeat le.pre-escribir(); le.pre-escribir(); escribir(); escribir(); le.post-escribir(); le.post-escribir(); until false; until false; end escritor; end escritor;
70
35
7.1 Monitores
Lectores-escritores con monitores
MONITOR type ;; typele-control le-control= =monitor monitor var lectores, escritores :Integer; var lectores, escritores :Integer; leer , ,escribir ;; leer escribir: :condition condition procedure procedureentry entrypre-leer(); pre-leer(); if ;; if escritores escritores> >0 0then thenleer.wait leer.wait lectores lectores:= :=lectores+1; lectores+1; leer.signal ; ;(* leer.signal (*despertar despertaral alsiguiente siguiente*) *) end ;; end procedure procedureentry entrypost-leer(); post-leer(); lectores := lectores-1; lectores := lectores-1; if ;; iflectores lectores= =0 0then thenescribir.signal escribir.signal end ; end; Inanicin Inanicinpara paraescritores escritores procedure entry pre-escribir(); procedure entry pre-escribir(); if if escritores escritores> >0 0or orlectores lectores> >0 0 then ;; thenescribir.wait escribir.wait escritores escritores:= :=escritores+1; escritores+1; end ; end; procedure procedureentry entrypost-escribir(); post-escribir(); escritores := escritores :=escritores-1; escritores-1; if ifleer.awaited leer.awaited> >0 0 then ;; thenleer.signal leer.signal else ;; elseescribir.signal escribir.signal end ; end; begin begin lectores:=0; lectores:=0;escritores:=0; escritores:=0; end .. end
71
7.1 Monitores
Lectores-escritores con monitores
MONITOR type ;; typele-control le-control= =monitor monitor var varlectores, lectores,escritores escritores:Integer; :Integer; leer , ,escribir ;; leer escribir: :condition condition procedure procedureentry entrypre-leer(); pre-leer(); if escritores if escritores> >0 0or orescribir.awaited escribir.awaited> >0 0 then leer.wait ; then leer.wait; lectores lectores:= :=lectores+1; lectores+1; leer.signal ; ;(* leer.signal (*despertar despertaral alsiguiente siguiente*) *) end ; end; procedure procedureentry entrypost-leer(); post-leer(); lectores := lectores-1; lectores := lectores-1; if ;; iflectores lectores= =0 0then thenescribir.signal escribir.signal end ;; end Inanicin Inanicinpara paralectores lectores procedure entry pre-escribir(); procedure entry pre-escribir(); if if escritores escritores> >0 0or orlectores lectores> >0 0 then ;; thenescribir.wait escribir.wait escritores escritores:= :=escritores+1; escritores+1; end ; end; procedure procedureentry entrypost-escribir(); post-escribir(); escritores := escritores :=escritores-1; escritores-1; if ifescribir.awaited escribir.awaited> >0 0 then ;; thenescribir.signal escribir.signal else ;; elseleer.signal leer.signal end ; end; begin begin lectores:=0; lectores:=0;escritores:=0; escritores:=0; end .. end
72
36
7.1 Monitores
Lectores-escritores con monitores
MONITOR type ;; typele-control le-control= =monitor monitor var varlectores, lectores,escritores escritores:Integer; :Integer; leer , ,escribir ;; leer escribir: :condition condition procedure procedureentry entrypre-leer(); pre-leer(); if if escritores escritores> >0 0or orescribir.awaited escribir.awaited> >0 0 then leer.wait ; then leer.wait; lectores lectores:= :=lectores+1; lectores+1; leer.signal ; ;(* leer.signal (*despertar despertaral alsiguiente siguiente*) *) end ;; end procedure procedureentry entrypost-leer(); post-leer(); lectores lectores:= :=lectores-1; lectores-1; if ;; iflectores lectores= =0 0then thenescribir.signal escribir.signal end ;; end Sin SinInanicin Inanicin procedure entry procedure entrypre-escribir(); pre-escribir(); if if escritores escritores> >0 0or orlectores lectores> >0 0 then ;; thenescribir.wait escribir.wait escritores escritores:= :=escritores+1; escritores+1; end ; end; procedure procedureentry entrypost-escribir(); post-escribir(); escritores := escritores :=escritores-1; escritores-1; if ifleer.awaited leer.awaited> >0 0 then ;; thenleer.signal leer.signal else ;; elseescribir.signal escribir.signal end ; end; begin begin lectores:=0; lectores:=0;escritores:=0; escritores:=0; end .. end
73
7.1 Monitores
Monitores: espera condicional Cuando se produce una llamada a x.signal, qu proceso se activa? El monitor permite una variante de la operacin wait sobre una variable condicin para que, cuando se produzca la operacin signal, se active a los procesos suspendidos por orden de prioridad. Se define la siguiente construccin: x.wait(c) donde:
c es una expresin entera que se evala cuando se realiza la operacin wait. El valor de c se almacena junto al proceso suspendido. Al invocar la operacin signal, se activa el proceso que tenga mayor prioridad (menor valor numrico de c).
74
37
7.1 Monitores
Monitores espera condicional type typeasignacion-recurso asignacion-recurso= =monitor monitor var ocupado: boolean; var ocupado: boolean; x ::condition ;; x condition procedure entry procedure entryadquirir(tiempo: adquirir(tiempo:integer); integer); begin begin if ifocupado ocupadothen thenx.wait(tiempo); x.wait(tiempo); ocupado:= true; ocupado:= true; end ;; end procedure procedureentry entryliberar; liberar; begin begin ocupado:= ocupado:=false; false; x.signal; x.signal; end ;; end begin begin ocupado:= ocupado:=false; false; end .. end
Comunicacin y sincronizacin de Procesos 75
Asignacin de recursos basada en tiempo de uso. De aquellos procesos que se encuentren esperando por el recurso ocupado, se reanudar aquel que lo vaya a usar durante menos tiempo.
76
38
77
especificacin especificacin protected protected [type] [type] Nombre [ (Discriminantes) ] Nombre [ (Discriminantes) ] is is procedure ; procedure Pnombre(Params) Pnombre(Params) ; function function Fnombre(Params) Fnombre(Params) return return Un_Tipo; Un_Tipo; entry entry Enombre(Params); Enombre(Params); private private Datos_Protegidos Datos_Protegidos : : Su_Tipo; Su_Tipo; end end Nombre; Nombre;
instanciacin instanciacin
Comunicacin y sincronizacin de Procesos 78
39
La Laexpresin expresinde deuna unabarrera barrerano nopuede puede contener parmetros de la entrada. contener parmetros de la entrada.
79
E1 E2
80
40
protected protectedtype typeSemaforo Semaforo(Inicial:integer:=1) (Inicial:integer:=1) is is entry entryP; P; procedure procedureV; V; private private contador :Integer:=Inicial; contador :Integer:=Inicial; end Semaforo; end Semaforo;
utilizacin utilizacin
protected protectedbody bodySemaforo Semaforois is entry P when contador>0 entry P when contador>0is is begin begin contador:=contador-1; contador:=contador-1; end endP; P; procedure procedureV Vis is begin begin contador:=contador+1; contador:=contador+1; end endV; V; end endSemaforo; Semaforo;
Un_semaforo: Un_semaforo:Semaforo(5); Semaforo(5); .... .... Un_semaforo.P; Un_semaforo.P; .... .... Un_semaforo.V; Un_semaforo.V;
Sistemas Operativos I (00-01)
81
procedure Prodcons is
n : constant Integer := 10; subtype Indice is Integer range 0..n-1; subtype Cantidad is Integer range 0..n; subtype Item is Integer ; type Buffers is array (Indice) of Item; task tasktype typeProductor; Productor; task tasktype typeConsumidor; Consumidor; Un_Buffer ::Buffer; Un_Buffer Buffer; Prod_1: Productor; Prod_1: Productor; Prod_2: Prod_2:Productor; Productor; Cons Cons ::Consumidor; Consumidor;
Sistemas Operativos I (00-01)
protected protectedtype typeBuffer Bufferis is entry Poner Poner (x (x::in inITEM); ITEM); entry Quitar Quitar(x (x::out outITEM); ITEM); private private Buf: ;; Buf:Buffers Buffers Entrada Entrada::Indice Indice:= :=0; 0; Salida Salida ::Indice Indice:= :=0; 0; Contador: Contador:Cantidad Cantidad:= :=0; 0; end endBuffer Buffer;;
82
41
task taskbody bodyProductor Productoris is xx::ITEM; ITEM; begin begin loop loop xx:= :=...; ...; Un_Buffer.Poner(x); Un_Buffer.Poner(x); ---otras otrasacciones acciones end endloop; loop; end endProductor Productor;; begin null; end ProdCons;
task taskbody bodyConsumidor Consumidoris is xx::ITEM; ITEM; begin begin loop loop Un_Buffer.Quitar(x); Un_Buffer.Quitar(x); ---otras otrasacciones acciones end endloop; loop; end endConsumidor; Consumidor;
84
42
85
8. Sincronizacin en POSIX
POSIX ofrece dos primitivas de sincronizacin de hilos: los mutex (o cerrojos) y las variables condicin. Mutex (cerrojos) Tienen dos estados posibles:
Abierto ningn hilo es el propietario Cerrado el hilo que lo cierra es el propietario. Un mutex no puede tener dos hilos propietarios simultneamente.
Cuando un hilo intenta cerrar un mutex que ya ha sido cerrado, se suspende hasta que el hilo propietario lo abra. Slo el hilo propietario puede abrir el mutex. Creacin e inicializacin de los mutex:
p_thread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
86
43
8. Sincronizacin en POSIX
Llamada
pthread_mutex_lock (mut)
Descripcin Si el mutex mut estaba abierto, lo cierra y el hilo que lo cierra es el propietario del mutex. Si estaba cerrado, suspende(*) al hilo hasta que se abra el mutex. Abre el mutex mut. Solo el hilo propietario del mutex puede abrirlo (**). Igual que pthread_mutex_lock pero en lugar de suspender al hilo si el semforo estaba cerrado, retorna immediatamente con un cdigo de error.
(*) Hay tipos de mutex, que le permiten al propietario cerrarlo varias veces sin bloquearse. Con este tipo de mutex, el propietario debe abrirlo tantas veces como lo hubiera cerrado para dejarlo finalmente abierto. (**) Hay sistemas, como Redhat 5.1, que permiten que otros hilos abran el mutex, sin embargo este funcionamiento no es portable.
Sistemas Operativos I (00-01) Comunicacin y sincronizacin de Procesos 87
8. Sincronizacin en POSIX
Variables condicin en POSIX Las variables condicin son un tipo abstracto de datos con tres operaciones bsicas: wait: suspende al proceso que la invoca en la condicin. signal: activa un proceso suspendido en la condicin broadcast: activa a todos los procesos suspendidos en la condicin Las variables condicin siempre deben estar asociadas a un mutex. Adems existen mtodos para limitar el tiempo que un hilo est bloqueado en una variable condicin. Creacin e inicializacin de atributos:
p_thread_cond_t c1 = PTHREAD_COND_INITIALIZER;
88
44
8. Sincronizacin en POSIX
Variables condicin en POSIX
Llamada
pthread_cond_wait(cond, mut)
pthread_cond_signal(cond)
Descripcin De forma atmica, realiza la operacin p_thread_mutex_unlock sobre mut, y bloquea al hilo en la variable condicin cond. Cuando es despertado, el hilo cierra nuevamente el mutex mut (realizando la operacin p_thread_mutex_lock. Despierta a uno de los hilos que estn bloqueados en la variable condicin. Si no hay hilos bloqueados, no sucede nada. Despierta todos los hilos bloqueados sobre cond. Igual que pthread_cond_wait pero si antes de duracion no se ha despertado al hilo, la llamada finalizar con un cdigo de error. Al despertar, el hilo que invoca la llamada, vuelve a cerrar el mutex mut.
89
8. Sincronizacin en POSIX
El productor consumidor en POSIX (i)
Variables globales: #define #definen n10 10 int intentrada, entrada,salida, salida,contador; contador; int int buffer[n]; buffer[n]; pthread_mutex_t pthread_mutex_t mutex mutex= =PTHREAD_MUTEX_INITIALIZER; PTHREAD_MUTEX_INITIALIZER; pthread_cond_t lleno = pthread_cond_t lleno =PTHREAD_COND_INITIALIZER; PTHREAD_COND_INITIALIZER; pthread_cond_t pthread_cond_t vacio vacio= =PTHREAD_COND_INITIALIZER; PTHREAD_COND_INITIALIZER;
90
45
8. Sincronizacin en POSIX
El productor consumidor en POSIX (i)
void void*productor(void *productor(void* *arg){ arg){ int inti; i; for for(i=0; (i=0;i<100; i<100;i++) i++)Insertar(i); Insertar(i); pthread_exit (0); pthread_exit (0); }} void void*consumidor(void *consumidor(void* *arg){ arg){ int inti; i; for for(i=0; (i=0;i<100; i<100;i++) i++) printf(%d printf(%d, ,Extraer()); Extraer()); pthread_exit (0); pthread_exit(0); }}
main( main()){{ pthread_t pthread_tth_a, th_a,th_b; th_b; entrada entrada= =salida salida= =contador contador= =0; 0; pthread_create (&th_a, pthread_create (&th_a,NULL,productor,NULL); NULL,productor,NULL); pthread_create (&th_b, pthread_create(&th_b,NULL,consumidor,NULL); NULL,consumidor,NULL); pthread_join (th_a, pthread_join (th_a,NULL); NULL); pthread_join (th_b, pthread_join (th_b,NULL); NULL);exit(0); exit(0);
}}
91
8. Sincronizacin en POSIX
El productor consumidor en POSIX (i)
Insertar Insertar(int (intdato) dato){{ pthread_mutex_lock(&mutex); while (contador >=n) pthread_cond_wait(&lleno, &mutex); buffer[entrada]= buffer[entrada]=dato; dato;entrada= entrada=(entrada+1) (entrada+1)% %n; n; contador= contador+1; contador= contador+1; pthread_cond_broadcast(&vacio); pthread_mutex_unlock(&mutex); }} int intExtraer Extraer(()){{ int intdato; dato; pthread_mutex_lock(&mutex); while (contador == 0) pthread_cond_wait(&vacio, &mutex); dato dato= =buffer[salida]; buffer[salida];salida= salida=(salida+1) (salida+1)% %n; n; contador=contador 1; contador=contador - 1; pthread_cond_broadcast(&lleno); pthread_mutex_unlock(&mutex); return returndato; dato; }}
Sistemas Operativos I (00-01) Comunicacin y sincronizacin de Procesos 92
46
93
P1
mensaje
P2
94
47
95
P1
A: proceso 15
P15
De: proceso 20
96
48
97
Nodo garbi
P2
Puerto 21 Puerto 55
P1
Puerto 90 Puerto 80
P3
98
49
99
a) El propietario: El proceso que lo crea es el propietario del puerto y es el nico que puede recibir o destruir el puerto. Cuando el proceso propietario finaliza, se destruyen todos los puertos que posee. Son necesarias las siguientes operaciones:
create(port): crea un puerto. destroy(port): destruye un puerto.
b) El que se vincula al puerto: El puerto pertenece al S.O. y su existencia es independiente de los procesos que lo utilizan. Cuando un proceso se vincula a un puerto, es el nico que puede recibir de l.
bind(puerto): vincula un proceso con un puerto.
100
50
101
P2
suspendido recv
P1
send suspendido
P2
102
51
Variantes:
Capacidad limitada: N est acotado. Capacidad ilimitada: N no est acotado.
Sincronizacin:
Receive de enlace vaco: Opcin bloqueante: suspender al proceso que la invoca. Opcin no bloqueante : devolver un error al proceso que la invoca. Send a un enlace lleno: Opcin bloqueante: suspender al proceso que la invoca. Opcin no bloqueante : devolver un error al proceso que la invoca o perder el mensaje.
103
Los espacios de direcciones son separados. No hay variables comunes. Versin con: Comunicacin directa. Comunicacin sncrona o asncrona (send y receive bloqueantes)
task productor; var item : elemento; repeat item := producir(); send( consumidor, item ); until false; end productor;
task consumidor; var item : elemento; repeat receive( productor, item ); consumir(item); until false; end consumidor;
104
52
task taskproductor; productor; var varitem item::elemento; elemento; m m::mensaje; mensaje; repeat repeat item item:= :=producir(); producir(); receive( ;; receive(consumidor, consumidor,m m)) construir_msj(m, construir_msj(m,item); item); send( consumidor, ;; send( consumidor,m m)) until false; until false; end endproductor; productor;
task taskconsumidor; consumidor; var varitem item::elemento; elemento; m m::mensaje; mensaje; i: i:integer; integer; for i:=1 ;; for i:=1to toN Ndo do send( send(productor, productor,m m)) repeat repeat receive( ;; receive(productor, productor,m m)) item item:= :=extraer_msj(m); extraer_msj(m); consumir(item); consumir(item); until untilfalse; false; end endconsumidor; consumidor;
105
106
53
C
respuesta
WWW
CLIENT CLIENT send (serv, ;; send (serv,peticin) peticin) recv (rem, ;; recv (rem,respuesta) respuesta) ... ...
SERVIDOR SERVIDOR repeat repeat recv (serv, ;; recv (serv,peticin, peticin,) ) respuesta= respuesta=trabajar(peticin); trabajar(peticin); rem=remite(peticion); rem=remite(peticion); send (rem, send (rem,respuesta, respuesta,); ); until untilfalse; false;
107
54