25
ITESM - CEM Sistemas Operativos I CB00856-1 Verano 2005 1 Prof. Erika MATA SANCHEZ [email protected] http://homepage.cem.itesm.mx/emata Verano 2006 Modulo 5. Semáforos y monitores Soluciones al problema de exclusión mutua Sistemas Operativos I Cb00856 – 1 Sistemas Operativos I 2 2 El problema del productor/consumidor

Semafor Os

  • Upload
    mattwex

  • View
    80

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Semafor Os

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

Page 2: Semafor Os

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

Page 3: Semafor Os

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

}}}}

}}}}

Page 4: Semafor Os

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

Page 5: Semafor Os

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

Page 6: Semafor Os

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

Page 7: Semafor Os

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.

Page 8: Semafor Os

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

------------- -------------------------- -------------

Page 9: Semafor Os

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 */

}}}}

}}}}

Page 10: Semafor Os

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

Page 11: Semafor Os

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

Page 12: Semafor Os

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.

Page 13: Semafor Os

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)

Page 14: Semafor Os

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

Page 15: Semafor Os

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

Page 16: Semafor Os

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.

Page 17: Semafor Os

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.

Page 18: Semafor Os

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.

Page 19: Semafor Os

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

Page 20: Semafor Os

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

Page 21: Semafor Os

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;

Page 22: Semafor Os

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

Page 23: Semafor Os

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;

Page 24: Semafor Os

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

Page 25: Semafor Os

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