So 2009-mod 06

10
1 Sincronización de Procesos Módulo 6 Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Fundamentos El Problema de la Sección Crítica La Solución de Peterson y otras Hardware de Sincronización Sincronización de Procesos Sistemas Operativos – Sincronización de Procesos JRA © 2009 Semáforos Problemas Clásicos de Sincronización Monitores Ejemplos 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 Procesos JRA © 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 : : : : Consumidor : : : : Sistemas Operativos – Sincronización de Procesos JRA © 2009 Luego de una operación de Productor y otra de Consumidor … contador permanece invariante contador = 4 contador:= contador+1; contador:= contador-1; : : : : : : : : Productor El Problema : : : : Consumidor : : : : reg b contador reg a contador Sistemas Operativos – Sincronización de Procesos JRA © 2009 reg a = 5 : : : : : : : reg b reg b -1 contador reg b reg b = 3 contador = 5 reg a reg a +1 contador reg a P1 El Problema a = b = 1 a:= a+1; : : : : P2 a:= 2 * a; : : : : Sistemas Operativos – Sincronización de Procesos JRA © 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; b:= 2 * b; : : : : : : : :

Transcript of So 2009-mod 06

Page 1: 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;

::::

::::

Page 2: So 2009-mod 06

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

Page 3: So 2009-mod 06

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.

Page 4: So 2009-mod 06

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

Page 5: So 2009-mod 06

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);

Page 6: So 2009-mod 06

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;

Page 7: So 2009-mod 06

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.

Page 8: So 2009-mod 06

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

Page 9: So 2009-mod 06

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)

Page 10: So 2009-mod 06

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