So 2009-mod 06
Transcript of So 2009-mod 06
1
Sincronización de Procesos
Módulo 6
Departamento de Ciencias e Ingeniería de la ComputaciónUniversidad Nacional del Sur
FundamentosEl Problema de la Sección CríticaLa Solución de Peterson y otrasHardware de Sincronización
Sincronización de Procesos
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
SemáforosProblemas Clásicos de SincronizaciónMonitoresEjemplos de Sincronización
El acceso concurrente a datos compartidos puede resultar en inconsistencias.Mantener la consistencia de datos requiere mecanismos para asegurar la ejecución ordenada de procesos cooperativos.La solución con memoria compartida al problema del
Fundamentos
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
La solución con memoria compartida al problema del buffer limitado (módulo anterior) permite a lo sumo n – 1 items en el buffer al mismo tiempo. Una solución, donde todos los N buffers son usados, no es simple.
Supóngase que se modifica el código del productor-consumidor agregando una variable contador, inicializado a 0 e incrementado en cada momento que un nuevo item es agregado al buffer
Productor
El Problema
contador = 4
t d t d +1
::::
Consumidor
t d t d 1
::::
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Luego de una operación de Productor y otra de Consumidor … contador permanece invariante
contador = 4
contador:= contador+1; contador:= contador-1;
::::
::::
rega ← contador rega ← contador
Productor
El Problema
::::
Consumidor
::::
regb ← contador regb ← contador rega ← contador
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
contador:= contador+1;rega ← rega+1
contador ← rega
rega ← rega+1
contador ← rega
rega= 5
contador = 4
contador:= contador-1;
::::
::::
regb ← regb - 1
contador ← regb
contador = 3
regb ← regb - 1
contador ← regb
regb= 3
contador = 5
rega ← rega+1
contador ← rega
P1
El Problema
a = b = 1
a:= a+1;
::::
P2
a:= 2 * a;
::::
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Luego de la ejecución de P1 seguida de P2 los valores de a y b deben ser iguales entre sí
a = b = 4
;b:= b+1;
a a;b:= 2 * b;
::::
::::
2
P1
El Problema
a = b = 1
a:= a+1;
::::
P2
a:= 2 * a;
::::
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Luego de la ejecución de P1 y P2 los valores de a y b deberían ser igualesentre sí, pero no lo son.
a = 4 , b = 3
;b:= b+1;
a: 2 a;b:= 2 * b;
::::
::::
LA sig(A) C sig(C)B sig(B)
El Problema
D sig(D) E sig(E)
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
D sig(D) E sig(E)
: :
: :
sig(D) ← LL ← D
sig(E) ← LL ← E
LA sig(A) C sig(C)B sig(B)
El Problema
D sig(D) E sig(E)
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
D sig(D) E sig(E)
: :
: :
sig(D) ← LL ← D
sig(E) ← LL ← E
sig(E) ← LL ← E
LA sig(A) C sig(C)B sig(B)
El Problema
D sig(D) E sig(E)
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
sig(E) ← LL ← E
D sig(D) E sig(E)
: :
: :
sig(D) ← LL ← D
sig(D) ← LL ← D
LA sig(A) C sig(C)B sig(B)
El Problema
D sig(D) E sig(E)
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
D sig(D) E sig(E)
: :
: :
sig(D) ← LL ← D
sig(D) ← LL ← D
sig(E) ← LL ← E
sig(E) ← LL ← E
sig(D) ← LL ← D
LA sig(A) C sig(C)B sig(B)
El Problema
D sig(D) E sig(E)
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
D sig(D) E sig(E)
: :
: :
sig(D) ← LL ← D
sig(E) ← LL ← E
3
LA sig(A) C sig(C)B sig(B)
El Problema
D sig(D) E sig(E)
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
D sig(D) E sig(E)
: :
: :
sig(D) ← LL ← D
sig(E) ← LL ← E
sig(E) ← LL ← E
sig(D) ← LL ← D
LA sig(A) C sig(C)B sig(B)
El Problema
D sig(D) E sig(E)
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
D sig(D) E sig(E)
: :
: :
sig(D) ← LL ← D
sig(E) ← LL ← E
sig(E) ← LL ← E
sig(D) ← LL ← D
LA sig(A) C sig(C)B sig(B)
El Problema
D sig(D) E sig(E)
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
D sig(D) E sig(E)
: :
: :
sig(D) ← LL ← D
sig(E) ← LL ← E
sig(E) ← LL ← E
sig(D) ← LL ← D
Condición de Carrera
Condición de carrera – Es la situación donde varios procesos acceden y manejan datos compartidos concurrentemente. El valor final de los datos compartidos depende de que proceso termina último.
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Para prevenir las condiciones de carrera , los procesos concurrentes cooperativos deben ser sincronizados.
Problema de la Sección Crítica
n procesos todos compitiendo para usar datos compartidosCada proceso tiene un segmento de código llamado sección crítica, en la cual los datos
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
compartidos son accedidosProblema – asegurar que cuando un proceso está ejecutando en su sección crítica, no se le permite a otro proceso ejecutar en su respectiva sección crítica.
Solución al Problema de la Sección Crítica1. Exclusión Mutua. Si el proceso Pj está ejecutando en su sección
crítica, entonces ningún otro proceso puede estar ejecutando en sus secciones críticas.
2. Progreso. Si ningún proceso está ejecutando en su sección crí-tica y existe algunos procesos que desean entrar en sus secciones criticas, entonces la selección de procesos que desean entrar en la sección crítica no puede ser pospuesta indefinidamente.
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
3. Espera Limitada. Debe existir un límite en el número de veces que a otros procesos les está permitido entrar en sus secciones críticas después que un proceso ha hecho un requerimiento para entrar en su sección crítica y antes que ese requerimiento sea completado.
Asuma que cada proceso ejecuta a velocidad distinta de cero. No se asume nada respecto a la velocidad relativa de los nprocesos.
4
Solo 2 procesos, P0 y P1
Estructura general del proceso Pi
repeat
sección crítica (SC)
Resolución del Problema
protocolo de entrada
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
( )
resto de secciónuntil falso
Los procesos pueden compartir algunas variables comunes para sincronizar sus acciones.
protocolo de entrada
Solución de Peterson
Proceso Pirepeat
flag [i] := true;turn := j;while (flag [j] and turn = j) do no-op;
sección crítica
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
flag [i] := false;resto de sección
until false;
Alcanza los tres requerimientos; resuelve el problema de la sección crítica para dos procesos.
Algoritmo para N Procesos
Antes de entrar en su sección crítica, el proceso recibe un número. El poseedor del número mas chico entra en su sección crítica.
Sección crítica para n procesos
(Algoritmo del “panadero”)
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Si los procesos Pi y Pj reciben el mismo número , si i< j, entonces Pi es servido primero; sino lo es Pj .El esquema de numeración siempre genera números en orden incremental de enumeración;
p.e., 1,2,3,3,3,3,4,5...
Algoritmo para N Procesos(Cont.)
Notación orden lexicográfico (ticket #,id proceso #)(a,b) < c,d) si a < c o si a = c y b < dmax (a0,…, an-1) es un número k, tal que k ≥ ai para i = 0, …, n – 1
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Dato compartidovar choosing: array [0..n – 1] of boolean;
number: array [0..n – 1] of integer,Las estructuras de datos son inicializadas a false y 0 respectivamente.
repeatchoosing[i] := true;number[i] := max(number[0], number[1], …, number [n – 1])+1;choosing[i] := false;for j := 0 to n – 1
do begin
Algoritmo para N Procesos(Cont.)
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
while choosing[j] do no-op;while number[j] ≠ 0
and (number[j],j) < (number[i], i) do no-op;end;sección crítica
number[i] := 0;resto de sección
until false;
Sincronización por Hardware
Muchos sistemas proveen soporte por hardware para el código de la sección críticaMonoprocesador – pueden deshabilitarse las interrupciones
El código que esta corriendo debe ejecutar sin apropiaciónGeneramente es demasiado ineficiente en sistemas multiprocesador
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Los SOs que usan esto no son ampliamente escalablesLas computadoras modernas proveen instrucciones especiales que se ejecutan atómicamente
Atómico = no-interrumpibleSea por verificación de una palabra de memoria y su inicializaciónO por intercambio de dos palabras de memoria
5
Solución usando Test-and-Set
Verifica y modifica el contenido de una palabra atomicamente.
función Test-and-Set (var target: boolean): boolean;b i
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
beginTest-and-Set := target;target := true;
end;
Dato compartido : var lock: boolean (inicialmente false)Proceso Pi
repeatwhile Test-and-Set (lock) do no-op;
sección crítica
Exclusión Mutua con Test-and-Set
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
sección críticalock := false;
resto de secciónuntil false;
Instrucción Swap
Definición:
void Swap (boolean *a, boolean *b){
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
boolean temp = *a;*a = *b;*b = temp:
}
Solución usando SwapLa variable booleana compartida es inicializada en FALSE; Cada proceso tiene una variable local booleana keySolución:
while (true) {key = TRUE;while ( key == TRUE)
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Swap (&lock, &key );// sección critica
lock = FALSE;// sección restante
}
Semáforos
Es una herramienta de sincronización.Semáforo S – variable enteraDos operaciones standard modifican S: wait() y signal()Originalmente llamadas P() y V()
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Puede ser accedido solo por dos operaciones indivisibles (deben ser atómicas):
wait (S): while S≤ 0 do no-op;S := S – 1;
signal (S): S := S + 1;
El Semáforo como Herramienta General de SincronizaciónSemáforo de Cuenta – el valor entero puede tener un rango sobre un dominio sin restricciones.Semáforo Binario – el valor entero puede tener un rango solo entre 0 y 1; puede ser más simple de implementar
También se los conoce como mutex locksPuede implementarse un semáforo de cuenta S como un
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
psemáforo binarioProvee exclusión mutua
Semáforo S; // inicializado en 1wait (S);
Sección Criticasignal (S);
6
El Semáforo como Herramienta General de Sincronización
Ejecute B en Pj solo después que A ejecute en Pi
Use el semáforo flag inicializado a 0Código:
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Pi Pj
M M
A wait(flag)signal(flag) B
Implementación de S con Semáforos Binarios
Estructuras de datos:
var S1: binary-semaphore;S2: binary-semaphore;S3: binary-semaphore;
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
S3: binary semaphore;C: integer;
Initialización:S1 = S3 = 1S2 = 0C = valor inicial del semaforo S
Implementación de S (Cont.)operación wait
wait(S3);wait(S1);C := C – 1;if C < 0then begin
signal(S1);wait(S2);
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
wait(S2);end
else signal(S1);signal(S3);
operación signalwait(S1);C := C + 1;if C ≤ 0 then signal(S2);signal(S1);
Implementación del Semáforo
Debe garantizar que dos procesos no puedan ejecutar wait ()y signal () sobre el mismo semáforo al mismo tiempoEntonces, la implementación se convierte en el problema de la sección crítica donde el código del wait y el signal son la sección crítica.
Podemos tener ahora espera ocupada en la
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Podemos tener ahora espera ocupada en la implementación de la sección crítica porque:
El código de implementación es cortoPoca espera ocupada si la sección crítica está raramente invocada
Note que las aplicaciones pueden pasar y gastar mucho tiempo en secciones críticas, entonces esta no es una buena solución.
Implementación de Semáforo sin Espera Ocupada
Con cada semáforo hay asociada una cola de espera.Cada entrada en dicha cola tiene dos datos:
valor (de tipo entero)puntero al próximo registro en la lista
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Dos operaciones:block – ubica el proceso invocando la operación en la apropiada cola de espera .wakeup – remueve uno de los procesos en la cola de espera y lo ubica en la cola de listos.
Implementación (Cont.)Las operaciones del semáforo se definen como
wait(S): S.value := S.value – 1;if S.value < 0
then beginagregue este proceso a S.L;
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
block;end;
signal(S): S.value := S.value + 1;if S.value ≤ 0
then beginremueva un proceso P de S.L;wakeup(P);
end;
7
Interbloqueo e InaniciónInterbloqueo – dos o más procesos están esperando indefinidamente por un evento que puede ser causado por solo uno de los procesos que esperan.Sean S y Q dos semáforos inicializados a 1
P0 P1
wait(S); wait(Q);
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
wait(Q); wait(S);M M
signal(S); signal(Q);signal(Q); signal(S);
Inanición – bloqueo indefinido. Un proceso no puede ser removido nunca de la cola del semáforo en el que fue suspendido.
Problemas Clásicos de Sincronización
Problema del Buffer LimitadoProblema de Lectores y EscritoresProblema de los Filósofos Cenando
Sistemas Operativos – Sincronización de ProcesosJRA © 2009 4
Problema del Buffer Limitado
Datos compartidostype item = …var buffer = …
full, empty, mutex: semaphore;
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
nextp, nextc: item;full :=0; empty := n; mutex :=1;
Problema del Buffer Limitado (Cont.)
Proceso Productorrepeat
…produce un item en nextp
…wait(empty);
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
wait(empty);wait(mutex);
…agregue nextp al buffer
…signal(mutex);signal(full);
until false;
Problema del Buffer Limitado(Cont.)
Proceso Consumidor repeat
wait(full)wait(mutex);
…remueve un item de buffer a nextc
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
remueve un item de buffer a nextc…
signal(mutex);signal(empty);
…consume el item en nextc
…until false;
Problema de los Lectores-EscritoresUn conjunto de datos es compartido entre un número de procesos concurrentes
Lectores – solo leen el conjunto de datos, no realizan actualizacionesEscritores – pueden leer y/o escribir
Problema – permitir a múltiples lectores leer al mismo tiempo. Un
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
p p psolo escritor puede acceder a los datos compartidos al mismo tiempo.Datos compartidos
Conjunto de datosSemáforo mutex inicializado a 1.Semáforo wrt inicializado a 1.Entero readcount inicializado a 0.
8
Problema de los Lectores-Escritores
Datos compartidosvar mutex, wrt: semaphore (=1);
readcount : integer (=0);
Proceso Escritor
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
wait(wrt);…
se realiza la escritura…
signal(wrt);
Problema de los Lectores-Escritores
Proceso Lectorwait(mutex);
readcount := readcount +1;if readcount = 1 then wait(wrt);
signal(mutex);…
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
…se realiza la lectura
…wait(mutex);
readcount := readcount – 1;if readcount = 0 then signal(wrt);
signal(mutex):
Problema de los Filósofos Cenando
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Datos compartidosFuente con arroz (conjunto de datos) var chopstick: array [0..4] of semaphore;(=1 inicialmente)
Problema de los Filósofos Cenando
Filósofo i:repeat
wait(chopstick[i])wait(chopstick[i+1 mod 5])
…comer
Sistemas Operativos – Sincronización de ProcesosJRA © 2009 4
…signal(chopstick[i]);signal(chopstick[i+1 mod 5]);
…pensar…
until false;
Problemas con Semáforos
Incorrecto uso de las operaciones sobre semáforos:
signal (mutex) …. wait (mutex)
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
wait (mutex) … wait (mutex)
Omitir el wait (mutex) o el signal (mutex) (o ambos)
MonitoresEs un constructor de sincronización de alto nivel que permite compartir en forma segura un tipo de dato abstracto entre procesos concurrentes.
type monitor-name = monitordeclaraciones de variablesprocedure entry P1 :(…);
b i d
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
begin … end;procedure entry P2(…);
begin … end;M
procedure entry Pn (…);begin…end;
begincódigo de inicialización
end
9
Vista esquemática de un Monitor
datoscompartidoscola de entrada
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
...
código inicialización
operaciones
Variables de Condición
condición x, y;
Dos operaciones sobre una variable de condición
x wait () el proceso que invoca esa
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
x.wait () – el proceso que invoca esa operación es suspendidox.signal () – reinicia uno de los procesos (si hay alguno) que invocó x.wait ()
Monitor con Variables de Condición
datoscompartidos
cola de entradaxy colas asociadas a las
variables de condición x e y
Sistemas Operativos – Sincronización de ProcesosJRA © 2009 5
código inicialización
...
operaciones
y
Solución de los Filósofos Cenandotype filósofos-cenando = monitor
var state : array [0..4] of :(pensando, hambre, comiendo);var self : array [0..4] of condition;procedure entry pickup (i: 0..4);
beginestado[i] := hambre,test (i);if t d [i] i d th lf[i] it
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
if estado[i] ≠ comiendo then self[i].wait,end;
procedure entry putdown (i: 0..4);begin
estado[i] := pensando;test (i+4 mod 5);test (i+1 mod 5);
end;
Solución de los Filósofos Cenando
procedure test(k: 0..4);begin
if estado[k+4 mod 5] ≠ comiendoand state[k] = hambreand state[k+1 mod 5] ] ≠ comiendo then begin
estado[k] := comiendo;
Sistemas Operativos – Sincronización de ProcesosJRA © 2009 5
estado[k] : comiendo;self[k].signal;
end;end;
beginfor i := 0 to 4
do estado[i] := pensando;end.
Solución de los Filósofos Cenando
Cada filósofo invoca las operaciones pickup() y putdown() en la siguiente secuencia:
dp.pickup (i)
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Comer
dp.putdown (i)
10
Ejemplos de Sincronización
SolarisWindows XPLinuxPthreads
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Sincronización en SOLARIS
Implementa una variedad de locks para soportar multitasking, multithreading (incluyendo threads en tiempo real), y multiprocesamiento.Usa mutex adaptivos para mayor eficiencia en la protección de datos para segmentos de código cortos.
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Usa variables de condición y locks lectores-escritores cuando grandes secciones de código necesitan acceder a los datos.Usa turnstiles para ordenar la lista de threads esperando para adquirir un mutex adaptivo o un lock lectores-escritores
Sincronización Windows XP
Usa máscaras de interrupción para proteger el acceso a recursos globales en sistemas mono procesadorUsa spinlocks en sistemas multiprocesadorTambiém provee dispatcher objects los cuales actuan como mutex y semáforos
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Los Dispatcher objects pueden proveer eventosUn evento actúa como una variable de condición
Sincronización en Linux
Linux:Deshabilita las interrupciones para implementar secciones críticas cortas
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Linux provee:semaforosspin locks
Sincronización en Pthreads
APIs Pthreads son independientes de los SOsProveen:
Locks mutexVariables de condición
Sistemas Operativos – Sincronización de ProcesosJRA © 2009
Extensiones no portables incluyen:Locks lector-escritorspin locks
Fin Módulo 6
Departamento de Ciencias e Ingeniería de la ComputaciónUniversidad Nacional del Sur