Вы находитесь на странице: 1из 15

Monitores

Mecanismo sincronizacin de nivel ms


alto que semforos
Construccin a nivel de lenguaje de
programacin que controla el acceso a
datos compartidos
Cdigo de sincronizacin es agregado por el
compilador y es reforzado en tiempo de
ejecucin
Por qu este es un mejor enfoque que el
proporcionado por semforos?
En qu consiste un Monitor?

Mdulo de software que encapsula


Estructuras de datos compartidas
Procedimientos que operan con los datos
compartidos
Sincronizacin entre hebras/procesos
concurrentes que llaman procedimientos
Garantiza acceso a datos compartido se
realice slo a travs de los procedimientos
definidos para su acceso
Ilustracin de un Monitor

Datos compartidos
Slo una hebra
en Monitor al mismo
Cola de hebras tiempo
para usar Monitor

Procedimientos

Cdigo de Inicializacin
Cmo controla acceso Monitor
Exclusin mutua
Slo una hebra/proceso puede estar
ejecutndose dentro del monitor
Sincronizacin esta implcita en el monitor
Si una hebra/proceso trata de entrar al
monitor cuando esta ocupado, entonces se
bloquea hasta que se desocupe
Ms restrictivo que semforos
Ms fcil de usar
Una vez dentro de un monitor una hebra
puede verse incapacitada de continuar
Permite a una que est esperando entrar a monitor
Variables de Condicin

Cuando hebra est dentro de un monitor


si no puede continuar se bloquea
Si provee evento que eventualmente otra
puede estar esperando notifica a posible hebra
que espera que puede entrar al monitor
Variables de Condicin se usan para tal efecto
Variables de condicin pueden ser accesadas
slo desde dentro de un monitor
Hay tres operaciones que se pueden realizar
con variables de condicin
Operaciones con Variables de
Condicin
Una hebra/proceso puede realizar las siguientes operaciones
con variables de condicin
Wait(var_cond)
libera lock del monitor y se bloquea
espera por otra hebra que le active (signal) la condicin
var_cond. (cuando es despertada recupera lock)
variables de condicin tienen asociadas cola de espera por
var_cond
Signal(var_cond)
despierta una (si hay) hebra/proceso esperando por
var_cond
signal se pierde si nadie espera por var_cond
Hoare: hebra que notifica inmediatamente entrega lock a
hebra que despierta
Mesa: hebra que notifica mantiene lock y procesador
(requiere signal sea ltima instruccin despues de salir de
procedimiento)
broadcast(var_cond)
despierta todos las hebras esperando por var_cond
Monitores, incluyendo variables de
condicin

lock

Procedimientos
Cola espera
monitor
monitor

Var cond1 Var cond2

Colas esperas
Variables de
condicin
Cmo resolver problemas con
monitores?
Identificar restricciones inherentes al problema
Identificar datos a encapsular en monitor
Definir procedimientos que accesarn datos
Identificar condiciones de espera y sealizacin,
asociar a variables de condicin
Identificar condiciones por las cuales hebras podran
necesitar para ejecutarse exitosamente en procedimientos
Identificar condiciones que se pueden producir en
procedimientos que podran necesitar otras hebras
Escribir los algoritmos
Ejemplo productor/consumidor
Identificar restricciones inherentes al problema
Las mismas que para el caso con semforos (el problema es el mismo)
Identificar datos a encapsular por monitor
Buffer, in, out, contador
Identificar procedimientos
Ingresar: llamado por productores, manipular in, buffer y contador en forma
exclusiva
Remover: llamado por consumidores, manipular out, buffer y contador en
forma exclusiva
Identificar condiciones de espera y sealizacin
Productor necesita esperar si buffer est lleno
Productor debe sealizar a consumidor despus de ingresar un elemento
(consumidor puede estar esperando por uno buffer estaba vaco)
Consumidor necesita esperar si buffer est vaco
Consumidor debe sealizar a productor despus de sacar un elemento de
buffer (productor puede estar esperando por posicin vaca)
Variables de condicin. Not_empty y not_full.
Productor espera por condicin not_full y sealiza condicin not_empty despues de
ingresar un elemento.
Consumidor espera por condicin not_empty y sealiza condicin not_full, despues
de sacar un elemento
Usando Monitores con
Productor/Consumidor
Monitor Producer_Consumer {
buffer items[N];
condition not_full, not_empty;
int count_items; // nmero de items en el buffer
int in, out;

procedure add_entry(item x){


while(count_items == N)
wait(not_full);
items[in] = x;
in = (in + 1)%N;
count_items++;
signal(not_empty);
}
procedure get_entry(item *x){
while(count_items == 0)
wait(not_empty);
*x = items[out];
out = (out + 1) %N;
count_items--;
signal(not_full);
}
}
Tipos de Monitores
Qu significa operacin signal?
Monitores de Hoare
Ejecutar hebra que espera inmediatamente
Hebra que notifica se bloquea inmediatamente
condicin garantizada para cuando hebra que esperaba se ejecute
hebra que notifica debe restaurar invariantes de monitor antes de
notoficar
Monitores Mesa
Hebra que espera se prepara para ejecutar, pero hebra que
notifica sigue en ejecucin
hebra que espera se ejecuta cuando hebra que notifica sale de
monitor
condicin puede ser falsa cuando hebra que esperaba se ejecuta
Hebra que notifica no necesita restaurar invariantes de monitor
Hebra que esperaba debe volver a verificar por condicin
Ejemplos con los dos tipos

Monitors de Hoare
if (not_ready)
wait(var_cond)
Monitors de Mesa
while(not_ready)
wait(var_cond)
Monitores de Mesa son ms fciles de usar
ms eficiente, menos cambios, soporta broadcast
directamente
Monitores de Hoare
condicin est garantizada de ser verdadera cuando
hebra que espera se ejecuta
Monitores en Java
Del tipo Mesa
Mtodos deben ser declarados con palabra clave
synchronized
Variables de condicin son annimas
Operaciones
wait() corresponde a wait(var_cond)
notify() corresponde a signal(var_cond)
despierta una hebra esperando por condicin. No
garanta de que sea la que h aesperado por ms tiempo
notifyAll() corresponde a broadcast(var_cond)
todas las hebras esperando condicin despiertan.
Cualquiera de ellas puede ejecutarse
Variables de Condicin y Mutex
Caso pthreads
Otra construccin
Variables de condicin pueden ser usadas con
mutexes
pthread_mutex_t mutex;
pthread_cond_t var_cond;
boolean ready;
void any(){
pthread_mutex_lock(&mutex);
if(!ready)
pthread_cond_wait(&var_cond, &mutex);
.
ready= TRUE;
pthread_cond_signal(&var_cond);
pthread_mutex_unlock(&mutex);
}
Resumen
Monitores de nivel ms alto que semforos
Permiten relacionar datos con primitiva de
sincronizacin
Un lock por monitor, hebras pueden salir entrar
de monitor temporalmente segn condiciones
Deben ser soportados por lenguaje de
programacin
Exclusin mutua garantizada por compilador
Aunque es posible usar locks y variables de
condicin
Menos flexible
Estructura de datos bien definida

Вам также может понравиться