Está en la página 1de 12

PROGRAMACIN CONCURRENTE

Tema 5 Monitores

Indice
Definicin de los monitores Sincronizacin condicional usando monitores Algunos problemas con monitores

Problemas de las regiones crticas condicionales


Pueden estar dispersas en el texto del programa. La integridad de la estructura de datos compartida es facilmente daada debido a que no hay control sobre que operaciones son realizadas por el programador dentro de una region crtica. Dificiles de implementar eficientemente.

Definicin de los monitores

Las regiones crticas se escriben como funciones y se encapsulan juntas en un mdulo nico llamado monitor.
4

Definicin de los monitores


Un monitor es un mecanismo que permite compartir de una manera fiable y efectiva tipos abstractos de datos entre procesos concurrentes. Asi pues un monitor proporciona:

Abastraccin de datos Exclusin mutua y mecanismos de sincronizacin entre procesos.

Un monitor es similar a un TAD en el sentido de que esconde la represnetacin interna de sus variables y proporciona al exterior slo el comportamiento funcional definido por las operaciones exportadas.

Definicin de los monitores


Un procedimiento exportado se puede invocar desde fuera del monitor:
identificador_monitor.identificador_procedimiento(parametros_actuales);

El compilador garantiza que el acceso al cdigo dentro de un monitor se realiza bajo exclusin mutua. Un proceso que intenta ejecutar un procedimiento del monitor cuando hay otro proceso ejecutando uno de los procedimientos en el mismo monitor se bloquea en la cola del monitor Cuando un proceso finaliza su llamada a procedimiento de monitor, la exclusin mutua se pasa a uno de los procesos bloqueados.
6

Sincronizacin condicional usando monitores


La sincronizacin condicional se proporciona mediante variables etiquetadas como condition. Son colas FIFO (inicializadas automticamente a la cola vaca en la declaracin) que no tiene valores accesibles para el programador. Se declaran:

var C: condition;
Se declaran dentro de un monitor y se usan para bloquear y desbloquear procesos.
7

Sincronizacin condicional usando monitores


Se definen dos operaciones (procedimientos) sobre una variable condition (C):
delay(C) resume(C)

delay(C) libera el monitor y bloquea el proceso invocador en C. resume(C) desbloquea el primer proceso esperando en C. La funcin empty retorna un valor booleano que determina si la cola est vaca.
8

Problema: Productor-Consumidor Buffer Limitado (1)


monitor Buffer; const TamaoBuffer = 5; MaxIndBuffer = 4; var Almacen : array[0..MaxIndBuffer] of char; NumChar: integer; NoLleno, NoVacio : condition; ProxEn, ProxSal: integer; procedure Insertar(ch: char); begin if NumChar >= TamaoBuffer then delay(NoLleno); Almacen[ProxEn] := ch; NumChar := NumChar +1; ProxEn := (ProxEn +1) mod TamaoBuffer; resume(NoVacio); end; procedure Sacar(var ch: char); begin if NumChar = 0 then delay(NoVacio); ch := Almacen[ProxSal]; NumChar := NumChar -1; ProxSal := (ProxSal +1) mod TamaoBuffer; resume(NoLleno); end; begin NumChar := 0; ProxEn := 0; ProxSal := 0; end;

Problema: Productor-Consumidor Buffer Limitado (2)


process Productor; var local : char; begin for local := a to z do Buffer.Insertar(local); end; process Consumidor; var ch: char; begin repeat Buffer.Sacar(ch); write(ch); until ch = z; writeln end; program pcmon; (*Definicin del monitor*) (*Proceso productor*) (*Proceso consumidor*) begin cobegin Productor; Consumidor; coend end;

10

Problema: Lectores Escritores (1)

process type Lector; begin repeat LeerEscribir.Entrada(true); (*Acceder a los datos*) LeerEscribir.Salida(true); (*Usar la informacin*) forever end;

process type Escritor; begin repeat (* Producir nueva informacin *) LeerEscribir.Entrada(false); (*Modificar los datos*) LeerEscribir.Salida(false); forever end;

11

Problema: Lectores Escritores (2)


monitor LeerEscribir; var ContadorLect: integer; EscritorActivo: boolean; OKLeer, OKEscribir: condition; procedure Entrada(Leyendo: boolean); begin if Leyendo then begin if EscritorActivo or not empty(OKEscribir) then delay(OKLeer); ContadorLect := ContadorLect +1; resume(OKLeer); end else begin if EscritorActivo or (ContadorLectores <> 0) then delay(OKEscribir); EscritorActivo := true; end end; procedure Salida(Leyendo: boolean); begin if Leyendo then begin ContadorLect := ContadorLect -1; if ContadorLect = 0 then resume(OKEscribir); end else begin EscritorActivo := false; if not empty(OKLeer) then resume(OKLeer) else resume(OKEscribir) end end; begin EscritorActivo := false; ContadorLect := 0; end; 12

También podría gustarte