Upload
mattwex
View
80
Download
0
Embed Size (px)
Citation preview
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 1
Prof. Erika MATA [email protected]://homepage.cem.itesm.mx/emata
Verano 2006
Modulo 5.
Semáforos y monitoresSoluciones al problema de
exclusión mutua
Sistemas Operativos ICb00856 – 1
Sistemas Operativos I 22222
El problema del productor/consumidor
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 2
Sistemas Operativos I 33333
El problema del productor/consumidor
� Dos procesos comparten un almacén (buffer) de tamaño fijo.� productor: coloca información en el almacén (buffer)� consumidor: obtiene información del almacén
� Problema:� productor desea colocar algo en el almacén lleno� consumidor desea obtener en el almacén vació
� Solución� irse a dormir cuando el almacén este lleno (productor)
o cuando se encuentre vacío (consumidor)
Sistemas Operativos I 44444
Planteamiento de la solución
� Dos variables compartidas por los procesos:
� N: número elementos en el almacén (buffer)
� Nm: número máximo elementos (tamaño buffer)
� Actividades productor:� verificar si N= Nm
� si es verdad => a dormir� si no es verdad => añadir un elemento
� Actividades consumidor:� verificar si N = 0
� si es verdad => a dormir� si no es verdad => quitar un elemento
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 3
Sistemas Operativos I 55555
Primitivas de la solución� Dos primitivas de comunicación son usadas entre los
procesos que bloquean el CPU.
� Primitiva despertar (wakeup)� despierta al proceso que invocó primitiva sleep� tiene un parámetro: el proceso a despertar
� Primitiva dormir (sleep)� provoca el bloqueo de quien hizo la
llamada� será suspendido hasta que alguien lo
despierte
Sistemas Operativos I 66666
Solución problema productor/consumidor
#define #define #define #define NmNmNmNm 100100100100 /* Número de espacios en el almacen (buffer) –-- N */
intintintint N = 0;N = 0;N = 0;N = 0; /* Número de elementos en el almacen (buffer) --- cont*/
voidvoidvoidvoid productor( )productor( )productor( )productor( )
{{{{
whilewhilewhilewhile (TRUE) {(TRUE) {(TRUE) {(TRUE) { /* ciclo infinito */
produce_elemproduce_elemproduce_elemproduce_elem(&elemento);(&elemento);(&elemento);(&elemento); /* genera el siguiente elemento */
ifififif (N == (N == (N == (N == NmNmNmNm)))) /* si el almacen (buffer) esta lleno */
sleepsleepsleepsleep();();();(); /* entonces se duerme */
intro_elem(elementointro_elem(elementointro_elem(elementointro_elem(elemento);););); /* colocar elemento en almacen */
N = N = N = N = N+1N+1N+1N+1 /* incrementa N elementos alma. */
ifififif (N == 1)(N == 1)(N == 1)(N == 1) /* estaba vacío el almacen (buffer) */
wakeup(consumidorwakeup(consumidorwakeup(consumidorwakeup(consumidor););););
}}}}
}}}}
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 4
Sistemas Operativos I 77777
Solución problema productor/consumidor
voidvoidvoidvoid consumidor( )consumidor( )consumidor( )consumidor( )
{{{{
whilewhilewhilewhile (TRUE) {(TRUE) {(TRUE) {(TRUE) { /* ciclo infinito */
ifififif (N == 0)(N == 0)(N == 0)(N == 0) /* si el almacen (buffer) esta vacío */
sleepsleepsleepsleep();();();(); /* entonces se duerme */
retira_elemretira_elemretira_elemretira_elem(&elemento);(&elemento);(&elemento);(&elemento); /* retira elemento del almacen */
N = N N = N N = N N = N ---- 1;1;1;1; /* decrementa conta. elementos alma */
ifififif (N == (N == (N == (N == NmNmNmNm----1)1)1)1) /* estaba lleno el almacen (buffer) */
wakeup(productorwakeup(productorwakeup(productorwakeup(productor););););
consume_elem(elementoconsume_elem(elementoconsume_elem(elementoconsume_elem(elemento);););); /* consume el elemento */
}}}}
}}}}
Sistemas Operativos I 88888
Problemas de la solución� Almacen vacío
Productor Consumidor
Consumidor lee count (count = 0)if (cont == 0) => verdad
Prod. introduce elemento en almacenIncrementa contif (cont == 1) => verdad
wakeup(consumidor);
/* cons no esta dormido, señal se pierde */
sleep()
producira elementos hasta que sellene el almacen y se ira a dormirsleep()
AMBOS DORMIRAN POR SIEMPRE
N = = = = countcountcountcount
Nm = = = = N N N N
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 5
Sistemas Operativos I 99999
Posible solución
� Añadir un bit de espera de despertar
� Sin embargo si se tienen dos o más procesosun solo bit no es suficiente.
Sistemas Operativos I 1010101010
Los semáforos
� Definidos por Dijkstra en 1965� Dijkstra, E. W., Cooperating sequential processes,
`Programming Languages', Genuys, F. (ed.), Academic Press, 1965
� Variable protegida cuyo valor solo puede ser accesado y alterado por dos operaciones:
P(S) y V(S)� Nombres provienen del holandés
passeren (probar) y vrijgeven (incrementar).
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 6
Sistemas Operativos I 1111111111
Las operaciones de semáforos
P(S) V(S)if ( S > 0 ) then if (alguien espera por S)
thenS:=S-1 deja pasar al proceso
else elseesperar por S S:=S+1
Sistemas Operativos I 1212121212
Características principales
� Desbloqueando procesos� El semáforo informa a los procesos que se encuentran
bloqueados. � El administrador de procesos que elige quien pasa a
ejecución
� Atomicidad� Se garantiza que al iniciar una operación con un semáforo,
ningún otro proceso puede tener acceso al semáforo hasta que la operación termine o se bloquee.
� En ese tiempo ningún otro proceso puede simultáneamente modificar el mismo valor de semáforo
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 7
Sistemas Operativos I 1313131313
Tipos de semáforos
ContadoresContadoresSincronizaciSincronizacióónn
BinariosBinarios
Sistemas Operativos I 1414141414
Semáforos generales o contadores� Útiles cuando un recurso será asignado, tomándolo de
un conjunto de recursos idénticos
� Semáforo es inicializado con el número de recursos existentes:� P(S) decrementa S en 1; indicando que un recurso ha sido
suprimido del conjunto. � Si S = 0 � no hay más recursos y el proceso se
bloquea
� V(S) incrementa S en 1; indicando que un recurso ha sido regresado al conjunto. � Si un proceso esperaba por un recurso, éste se
despierta.
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 8
Sistemas Operativos I 1515151515
Semáforos binarios� Sólo pueden tomar dos valores: 0 o 1� Generalmente se inicializan con un valor de 1.� Son usados por dos o más procesos para garantizar
que sólo uno puede entrar en sección crítica.� Antes de entrar a sección crítica un proceso ejecuta
un P(S) y un V(S) antes de salir de ella
� Estructura de cada proceso:
whilewhilewhilewhile(1)(1)(1)(1)
P(entrar)P(entrar)P(entrar)P(entrar)
<Secci<Secci<Secci<Seccióóóón Crn Crn Crn Críííítica>tica>tica>tica>
V(salirV(salirV(salirV(salir))))
dodododo
Sistemas Operativos I 1616161616
Semáforos sincronía� Solución varios problemas sincronización.� Sean dos procesos concurrentes P1 y P2 que se
encuentran corriendo:� P1 con enunciado S 1
� P2 con enunciado S 2
� Se desea que S 2 sea ejecutado después de que S 1 haya terminado .
� Solución: Semáforo síncrono (inicializado en 0).P1: ------------- P2: --------------
------------- --------------S1 P(sincro)
V(sincro) S 2
------------- -------------------------- -------------
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 9
Sistemas Operativos I 1717171717
Solución prod/cons semáforos (1)
#define N 100#define N 100#define N 100#define N 100 /* Número de espacios en el almacen (buffer) */
intintintint contcontcontcont = 0;= 0;= 0;= 0; * Número de elementos en el almacen (buffer) */
typedeftypedeftypedeftypedef intintintint semaphoresemaphoresemaphoresemaphore
semaphoresemaphoresemaphoresemaphore ocupado = 1;ocupado = 1;ocupado = 1;ocupado = 1;
semaphoresemaphoresemaphoresemaphore vaciovaciovaciovacio = N;= N;= N;= N;
semaphoresemaphoresemaphoresemaphore lleno = 0;lleno = 0;lleno = 0;lleno = 0;
Sistemas Operativos I 1818181818
Solución prod/cons semáforos (2)voidvoidvoidvoid productor( )productor( )productor( )productor( )
{{{{
whilewhilewhilewhile (TRUE) {(TRUE) {(TRUE) {(TRUE) { /* ciclo infinito */
produce_elemproduce_elemproduce_elemproduce_elem(&elemento);(&elemento);(&elemento);(&elemento); /* genera el siguiente elemento */
P(P(P(P(&vacio)))); /* decrementa contador espacios vacíos */
P(P(P(P(&ocupado)))); / * entra en la sección crítica */
intro_elem(elementointro_elem(elementointro_elem(elementointro_elem(elemento);););); /* colocar elemento en el almacen */
V(V(V(V(&ocupado)))); /* sale de la sección crítica */
V(V(V(V(&lleno)))); /* incrementa cont entradas ocupadas */
}}}}
}}}}
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 10
Sistemas Operativos I 1919191919
Solución prod/cons semáforos (3)
voidvoidvoidvoid consumidor( )consumidor( )consumidor( )consumidor( )
{{{{
whilewhilewhilewhile (TRUE) {(TRUE) {(TRUE) {(TRUE) { /* ciclo infinito */
P(P(P(P(&lleno)))); /* decrementa cont. entradas ocupadas */
P(P(P(P(&ocupado)))); /* entra en la sección crítica */
retira_elem(elementoretira_elem(elementoretira_elem(elementoretira_elem(elemento);););); /* toma un elemento del almacen */
V(V(V(V(&ocupado)))); /* sale de la sección crítica */
V(V(V(V(&vacio)))); /* incrementa contador entradas vacías */
haz_algo(elemento);haz_algo(elemento);haz_algo(elemento);haz_algo(elemento); /* hace algo con el elemento */
}}}}
}}}}
Sistemas Operativos I 2020202020
Ejemplo ejecución (1)PRODUCTOR CONSUMIDOR
produce_elem(&elemento)
P(&vacio)
vacio=99
P(&ocupado)
ocupado= 0
intro_elem(elemento)
V(&ocupado)
ocupado=1
P(&lleno)
proceso
bloqueado
Temina quantum, cambio CPU
Temina quantum, cambio CPU
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 11
Sistemas Operativos I 2121212121
Ejemplo ejecución (2)PRODUCTOR CONSUMIDOR
bloqueado
V(&lleno)
envio señal que proceso
esperaba
produce_elem(&elemento)
proceso despierta
P(&ocupado)
ocupado=0
retira_elem(...
Sistemas Operativos I 2222222222
Ejemplo ejecución (3)PRODUCTOR CONSUMIDOR
P(&vacio)
vacio=98
P(&ocupado)
proceso espera liberación
de la variable ocupado
V(&ocupado)
envio señal a quien
esperaba ocupado
V(&vacio)
vacio=99
haz_algo(elemento)
proceso despierta
intro_elem(elemento)
V(&ocupado)
ocupado=1
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 12
Sistemas Operativos I 2323232323
Problemas clásicos de exclusión mutua
� El problema de la cena de filósofos
� El problema del Barbero dormilón
� El problema de los fumadores
� El problema de la panadería
� El problema de los lectores/escritores
Sistemas Operativos I 2424242424
La cena de filósofosCinco filósofos se sientan en una mesa redonda. Cada uno tiene un plato de spaghetti y un tenedor frente a él.
Cinco filCinco filCinco filCinco filóóóósofos, cinco platos, cinco tenedoressofos, cinco platos, cinco tenedoressofos, cinco platos, cinco tenedoressofos, cinco platos, cinco tenedores
El spaghetti es tan escurridizo que un filósofo necesita dos tenedores para comerlo, pero cada filosofo solo posee un tenedor.un tenedor.un tenedor.un tenedor.
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 13
Sistemas Operativos I 2525252525
La cena de filósofos
La vida de un filósofo consta de periodos alternados de comer y pensar .
Cuando un filósofo siente hambre, intenta tomar el tenedor de la izquierda y si lo consigue, lo intenta con el de la derecha.
Si logra asir dos tenedores toma unos bocados y después deja los cubiertos y sigue pensando.
Sistemas Operativos I 2626262626
La cena de filósofos
El problema consiste en desarrollar un algoritmo que evite la
hambruna y el deadlock.
Deadlock – Ocurre cuando los 5 filosofos tienen un tenedor y
nadie puede tomar el segundo
F1 espera el tenedor que ocupa el F2 quien espera por el tenedor del F3 y así sucesivamente. (Cadena circular de bloqueo)
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 14
Sistemas Operativos I 2727272727
La cena de filósofos
Hambruna - si un filosofo no puede tomar 2 tenedores, puede ocurrir independientemente del deadlock.
Analogia de tenedores con recursos -- CONCURRENCIA
BLOQUEO - Técnica común para asegurar que solo un recurso sea utilizado a la vez:
• Cuando un programa se interesa por un recurso bloqueado por alguien mas, éste espera a que se desbloquee• Cuando muchos recursos se involucran puede ocurrir un Deadlock.
Sistemas Operativos I 2828282828
La cena de filósofos
Ejemplo:
un programa requiere procesar dos archivos. Cuando dos programas bloquean uno archivo cada uno, ambos esperan a que el otro desbloquée el segundo archivo…
NUNCA SUCEDE
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 15
Sistemas Operativos I 2929292929
La cena de filósofosUna solución:
• Ordenar los tenedores y decir a los filósofos de tomarlos en orden creciente• Filósofos : P1, P2, P3, P4 y P5• Tenedores: T1, T2, T3, T4 y T5. • P1 toma T1, si antes le permiten tomar el segundo tenedor T2.• P2 a P4 actúan igual, tomando Tx antes de Tx+1. • Pero P5 toma T1 antes de T5. • Cambia conducta normal: P5 genera una asimetría que
previene un deadlock.
Sistemas Operativos I 3030303030
La cena de filósofosUna solución: • Hambruna se previene en función del método MUTEX utilizado:
• busy waiting (ocupado, en espera) - causan
• Colas asegurando acceso equitativo al tenedor por medio del filosofo adyacente – una solucion
Solución general: Para un num arbitrario de agentes (A1...Am) que necesitan
acceso exclusivo a un num arbitrario de recursos (R1...Rn). Agentes:
1. Peticiones de acceso en orden creciente (i.e. Acceso a R3 antes de acceso a R4).
2. Si un agente tiene Rx y necesita Ry, debe liberar primero Rxsi x > y
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 16
Sistemas Operativos I 3131313131
Problema Barbero DormilónUna barbería tiene una sala de espera con n sillas, y otra sala donde se encuentra el sillón de afeitado. •Si no hay clientes a los que servir, el barbero se echa a dormir en el sillón. •Si entra un cliente en la barbería y todas las sillas están ocupadas, el cliente se va. •Si el barbero está ocupado afeitando, el cliente se sienta en una de las sillas disponibles. •Si el barbero está dormido, el cliente despierta al barbero. Escribir un programa que coordine al barbero y los clientes mediante semáforos.
Sistemas Operativos I 3232323232
Problema Barbero DormilónProblema clásico de IPC (Comunicacion interprocesos)
y sincronización entre múltiples procesos de SO
PROBLEMA:
Coordinación si crear condiciones de
competencia.
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 17
Sistemas Operativos I 3333333333
Problema Barbero DormilónSolucion comun: 3 semaforos
1. Espera clientes
2.Barbero (si esta desocupado)
3.MUTEX
Solo involucra al barbero:
single sleeping single sleeping single sleeping single sleeping barberbarberbarberbarber problemproblemproblemproblem....
Sistemas Operativos I 3434343434
Problema de los fumadoresConsidere un sistema con tres procesos fumadoresy un proceso agente . Cada fumador esta continuamente enrrollando y fumando cigarrillos. Sin embargo, para enrrollar y fumar un cigarrillo, el fumador necesita tres ingredientes: tabaco, papel, y fósforos . Uno de los procesos fumadores tiene papel, otro tiene el tabaco y el tercero los fósforos. El agente tiene una cantidad infinita de los tres materiales. El agente coloca dos de los ingredientes sobre la mesa. El fumador que tiene el ingrediente restante enrrolla un cigarrillo y se lo fuma, avisando al agente cuando termina. Entonces, el agente coloca dos de los tres ingredientes y se repite el ciclo. Sincronizar al agente y a los fumadores.
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 18
Sistemas Operativos I 3535353535
Problema Panadería de Lamport
Una panadería tiene una variedad de panes y pasteles vendidos por n vendedores. Cada uno de los cuales toma un número al entrar. El cliente espera hasta oír su número. Cuando el vendedor se desocupa, llama al siguiente número. Escriba un procedimiento para los vendedores y otro para los clientes.
Sistemas Operativos I 3636363636
Los monitores� Otra opción para la sincronización de procesos.� Introducido por Hoare
� C. A. R. Hoare's seminal research paper on monitors, "Monitors: An Operating System Structuring Concept," Communications of the ACM, Vol. 17, No. 10, October1974, pp. 549-557
� Se trata de una construcción concurrente que contiene los datos y procedimientos necesarios para la asignación de un recurso compartido.
� Para lograr la asignación de un recurso una función del proceso debe llamar una entrada del monitor.
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 19
Sistemas Operativos I 3737373737
Procesos y monitores
� Procesos no tienen acceso directo a las estructuras de datos.
� Solo un proceso puede estar activo en un monitor en cada momento.
� Cuando se llama a un entrada la implementación monitor verifica si no hay otro proceso dentro del monitor:� si: proceso efectuó la
llamada es suspendido� no: el que hizo la llamada
puede entrar
EstructuraDatos
Proc. 1
Proc. 2
E1
E2
E3
Proc. n En
: :
P1
P2
P3
procedimientosentradas
Sistemas Operativos I 3838383838
Operaciones sincronía en procesos� Para sincronizar procesos se usan variables de
tipo condición y dos operaciones:
1. wait()� proceso descubre que no puede continuar (almacen
lleno) ejecuta wait en alguna variable de condición proceso se bloquea y permite que otro proceso entre al monitor
2. signal� proceso que entra puede despertar a otro con una
instrucción signal sobre la variable de condición que el otro proceso espera
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 20
Sistemas Operativos I 3939393939
Comentarios variables condición
� Las variables de condición NO son contadores.
� No se acumulan señales para su usoposterior (como los semáforos)
� Si una variable de condición queda señaladasin que nadie la espere, la señal se pierde.
� La instrucción WAIT debe aparecer antes de SIGNAL � regla que hace más sencilla la implementación
Sistemas Operativos I 4040404040
Monitores y problema prod/cons� Exclusión mutua es automática,
� el monitor garantiza que solo el productor o el consumidorestaran ejecutandose
� Si el almacen esta totalmente ocupado, el productorrealizará una operación WAIT � se encontrará bloqueado hasta que consumidor ejecute un
SIGNAL
� Si el almacen esta totalmente vacio el consumidorrealizará una operación WAIT� se encontrará bloqueado hasta que productor ejecute un
SIGNAL
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 21
Sistemas Operativos I 4141414141
Solución prod/cons con monitoresmonitor ProdCons
condition lleno, vacio;integer cont, N;
procedureproducir;begin
if (cont = N) thenwait(lleno);
introducir_elemento;cont := cont +1;if (cont = 1) then
signal(vacio);end;
procedureretirar;begin
if (cont = 0) thenwait(vacio)
retirar_elemento;cont := cont-1if (cont = N-1) then
signal(lleno);end;
cont := 0; N=100;end monitor;
Sistemas Operativos I 4242424242
Llamando entradas monitor
procedure productor;
begin
while true do
begin
producir_elemento;
ProdCons.producir;
end
end;
procedure consumidor;
begin
while true do
begin
ProdCons.retirar;
consumir_elemento;
end
end;
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 22
Sistemas Operativos I 4343434343
Esquema solución prod/cons con monitores
procedure producir
P2ProdCons.producirProdCons.retirar
monitor ProdCons
condition lleno, vacio;integer cont, N;
procedure retirar
cont :=0;N:=100;
P1ProdCons.producirProdCons.retirar
Sistemas Operativos I 4444444444
Problema lectores/escritores
� En algunos sistemas computacionales se cuenta con dos tipos de procesos� procesos lectores : leen datos
� procesos escritores : escriben datos
� Ejemplo de este tipo de sistema: reservación aérea.
� Muchos lectores pueden acceder la base de datos a la vez� varios lectores no cambian el contenido de la base de datos
� Un escritor debe tener acceso exclusivo� un escrito puede modificar los datos
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 23
Sistemas Operativos I 4545454545
Planteamiento solución lec/esc
� Si el escritor esta activo� ningún lector o escritor puede estar activo
� Esta exclusión necesita realizarse solo a nivel registro (i.e. no toda la base de datos)� no es necesario garantizar a un escritor el acceso exclusivo a la
base de datos completa
� Problema propuesto por Courtois, Heymans y Parnas:� Courtois, P.J., Heymans, F., and Parnas, D.L. Concurrent
Control with Readers and Writers, CACM, Vol. 14, No. 10, October 1971, pp.667-668
Sistemas Operativos I 4646464646
Solución lectores/escritoresmonitor LectoresEscritores
var
lectores: integer;
alguien_escribe: boolean;
puede_leer, puede_escribir: condition;
procedurecomenzar_lectura;
begin
if ( (alguien_escribe) o en_cola(puede_escribir) ) then
wait(puede_leer)
lectores:= lectores + 1;
signal(puede_leer)
end;
procedureterminar_lectura;
begin
lectores:= lectores - 1;
if (lectores = 0 ) then
signal(puede_escribir);
end;
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 24
Sistemas Operativos I 4747474747
Solución lectores/escritoresprocedure comenzar_escritura;
begin
if ( (lectores > 0) or (alguien_escribe) ) then
waitwaitwaitwait(puede_escribir)
alguien_escribe:=true;
end;
procedure terminar_escritura;
begin
alguien_escribe:=false;
if ( en_cola(puede_leer)) then
signalsignalsignalsignal(puede_leer)
else
signalsignalsignalsignal(puede_escribir)
end
Sistemas Operativos I 4848484848
Solución lectores/escritores
beginbeginbeginbegin
lectores:=0;
alguien_escribe:= false;
endendendend;;;;
ITESM - CEM Sistemas Operativos I CB00856-1
Verano 2005 25
Sistemas Operativos I 4949494949
Ultimo comentario sobre solución
� El monitor lectores/escritores puede usarse paracontrolar el acceso a � una base de datos completa,
� un subconjutno de la base consistente de variosregistros
� sobre un simple registro