Monitores

15
Monitores Mecanismo sincronización de nivel más alto que semáforos Construcción a nivel de lenguaje de programación que controla el acceso a datos compartidos Código de sincronización es agregado por el compilador y es reforzado en tiempo de ejecución Por qué este es un mejor enfoque que el proporcionado por semáforos?

description

Monitores

Transcript of Monitores

Page 1: Monitores

Monitores

Mecanismo sincronización de nivel más alto que semáforos

Construcción a nivel de lenguaje de programación que controla el acceso a datos compartidos Código de sincronización es agregado por el

compilador y es reforzado en tiempo de ejecución

Por qué este es un mejor enfoque que el proporcionado por semáforos?

Page 2: Monitores

En qué consiste un Monitor?

Módulo de software que encapsula Estructuras de datos compartidas Procedimientos que operan con los datos

compartidos Sincronización entre hebras/procesos

concurrentes que llaman procedimientos Garantiza acceso a datos compartido se

realice sólo a través de los procedimientos definidos para su acceso

Page 3: Monitores

Ilustración de un Monitor

Datos compartidos

Procedimientos

Código de Inicialización

Cola de hebras para usar Monitor

Sólo una hebraen Monitor al mismotiempo

Page 4: Monitores

Cómo controla acceso Monitor

Exclusión mutua Sólo una hebra/proceso puede estar

ejecutándose dentro del monitor• Sincronización esta implícita en el monitor

Si una hebra/proceso trata de entrar al monitor cuando esta ocupado, entonces se bloquea hasta que se desocupe

• Más restrictivo que semáforos• Más fácil de usar

Una vez dentro de un monitor una hebra puede verse incapacitada de continuar

• Permite a una que está esperando entrar a monitor

Page 5: Monitores

Variables de Condición

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 Condición se usan para tal efecto Variables de condición pueden ser accesadas

sólo desde dentro de un monitor Hay tres operaciones que se pueden realizar

con variables de condición

Page 6: Monitores

Operaciones con Variables de Condición

Una hebra/proceso puede realizar las siguientes operaciones con variables de condición Wait(var_cond)

• libera lock del monitor y se bloquea• espera por otra hebra que le active (signal) la condición

var_cond. (cuando es despertada recupera lock)• variables de condición 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 instrucción despues de salir de procedimiento)

broadcast(var_cond)• despierta todos las hebras esperando por var_cond

Page 7: Monitores

Monitores, incluyendo variables de condición

lock

Var cond1 Var cond2

ProcedimientosmonitorCola espera

monitor

Colas esperasVariables de condición

Page 8: Monitores

Cómo resolver problemas con monitores?

Identificar restricciones inherentes al problema Identificar datos a encapsular en monitor Definir procedimientos que accesarán datos Identificar condiciones de espera y señalización,

asociar a variables de condición Identificar condiciones por las cuales hebras podrían

necesitar para ejecutarse exitosamente en procedimientos Identificar condiciones que se pueden producir en

procedimientos que podrían necesitar otras hebras Escribir los algoritmos

Page 9: Monitores

Ejemplo productor/consumidor

Identificar restricciones inherentes al problema Las mismas que para el caso con semáforos (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 señalización

Productor necesita esperar si buffer está lleno Productor debe señalizar a consumidor después de ingresar un elemento

(consumidor puede estar esperando por uno buffer estaba vacío) Consumidor necesita esperar si buffer está vacío Consumidor debe señalizar a productor después de sacar un elemento de

buffer (productor puede estar esperando por posición vacía) Variables de condición. Not_empty y not_full.

• Productor espera por condición not_full y señaliza condición not_empty despues de ingresar un elemento.

• Consumidor espera por condición not_empty y señaliza condición not_full, despues de sacar un elemento

Page 10: Monitores

Usando Monitores con Productor/Consumidor

Monitor Producer_Consumer {buffer items[N];condition not_full, not_empty;int count_items; // número de items en el bufferint 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);

}}

Page 11: Monitores

Tipos de Monitores

Qué significa operación signal? Monitores de Hoare

• Ejecutar hebra que espera inmediatamente

• Hebra que notifica se bloquea inmediatamente• condición 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 ejecución• hebra que espera se ejecuta cuando hebra que notifica sale de

monitor• condición 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 condición

Page 12: Monitores

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 más fáciles de usar más eficiente, menos cambios, soporta broadcast

directamente Monitores de Hoare

condición está garantizada de ser verdadera cuando hebra que espera se ejecuta

Page 13: Monitores

Monitores en Java

Del tipo Mesa Métodos deben ser declarados con palabra clave

“synchronized” Variables de condición son anónimas Operaciones

wait() corresponde a wait(var_cond) notify() corresponde a signal(var_cond)

• despierta una hebra esperando por condición. No garantía de que sea la que h aesperado por más tiempo

notifyAll() corresponde a broadcast(var_cond)• todas las hebras esperando condición despiertan.

Cualquiera de ellas puede ejecutarse

Page 14: Monitores

Variables de Condición y MutexCaso pthreads

Otra construcción Variables de condición pueden ser usadas con

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

}

Page 15: Monitores

Resumen

Monitores de nivel más alto que semáforos Permiten relacionar datos con primitiva de

sincronización Un lock por monitor, hebras pueden salir entrar

de monitor temporalmente según condiciones Deben ser soportados por lenguaje de

programación Exclusión mutua garantizada por compilador Aunque es posible usar locks y variables de

condición Menos flexible

Estructura de datos bien definida