Secciones Críticas y Exclusión Mutua
Secciones Críticas y Exclusión Mutua
Secciones Críticas y Exclusión Mutua
Estructura general
de un proceso Soluciones:
repeat debemos describir
sección de entrada las secciones de
entrada y de salida.
Acotando la seccion
critica tenemos que
poner los bloqueos
section crítica SC
sección de salida
sección restante SR Lo que sea local se mantiene en paralelo. Lo que es global es donde está la
seccion critica
forever
Si dos procesos compiten por un recurso y en un momento dado nadie lo está usando, el primero que lo pida es al que se le asigna
Una vez que empieza la seccion critica, acaba, no puede haber nada dentro que dependa de otra cosa y
que corra el riesgo de que nunca acabe.
4
Computación de Alto Rendimiento
Tipos de solución
Consideraremos 2 procesos
Algoritmos 1 (Decker)
Algoritmo 2 no válido
Algoritmo 3 válido (algoritmo de Peterson)
Generalización a n procesos
Algoritmo de Lamport (“panadero”)
Notación
Dos procesos: P0 y P1
Mas generalmente tendremos dos procesos Pi Pj (i != j)
Inicio:
flag[0]:=flag[1]:=fal
se turno:= i o j
El deseo de entrar en Process Pi: Necsito 2 variables globales: flag (array con
la zona crítica se
tantas posiciones como procesos) y turno
repeat
indica con
flag[i]:=true;
flag[i]:=true
turno:=j;
flag[i]:= false en la do {} while
sección de salida. (flag[j]and turno=j);
Si P0 y P1 intentan SC
simultáneamente flag[i]:=false;
entrar en su SC se lo SR
impide la variable forever
turno
Cuando los dos tienen el flag levantado, hay un turno, y a quien le toque es el que actúa, asi no hay inanización. La variable turno
soluciona la inanizacion cuando ambos flags están arriba.
Problema: si el proceso i entra y nunca sale, el proceso j no entrará nunca. En cada pasada se comprueba si j va a seguir, por tanto, si j
sigue, se malgasta un milisegundo comprobando para nada. Problema de ineficiencia.
9
Exclusion mutua :
10
11
Validez:
Si Pi está dentro SC es que Pk ha escogido un
number[k]!= 0, y (number[i],i) < (number[k],k)
12
Process Pi:
repeat
choosing[i]:=true;
number[i]:=max(number[0]..number[n-1])+1;
choosing[i]:=false;
for j:=0 to n-1 do {
while (choosing[j]) {};
while (number[j]!=0
and (number[j],j)<(number[i],i)){};
}
SC
number[i]:=0;
SR
forever
13
14
15
19
Computación de Alto Rendimiento
20
Computación de Alto Rendimiento
21
Computación de Alto Rendimiento
22
Computación de Alto Rendimiento
23
Computación de Alto Rendimiento