Monitores

11,293 views

Published on

Monitores

1 Comment
3 Likes
Statistics
Notes
No Downloads
Views
Total views
11,293
On SlideShare
0
From Embeds
0
Number of Embeds
87
Actions
Shares
0
Downloads
394
Comments
1
Likes
3
Embeds 0
No embeds

No notes for slide

Monitores

  1. 1. Monitores <ul><li>Mecanismo sincronización de nivel más alto que semáforos </li></ul><ul><li>Construcción a nivel de lenguaje de programación que controla el acceso a datos compartidos </li></ul><ul><ul><li>Código de sincronización es agregado por el compilador y es reforzado en tiempo de ejecución </li></ul></ul><ul><ul><li>Por qué este es un mejor enfoque que el proporcionado por semáforos? </li></ul></ul>
  2. 2. En qué consiste un Monitor? <ul><li>Módulo de software que encapsula </li></ul><ul><ul><li>Estructuras de datos compartidas </li></ul></ul><ul><ul><li>Procedimientos que operan con los datos compartidos </li></ul></ul><ul><ul><li>Sincronización entre hebras/procesos concurrentes que llaman procedimientos </li></ul></ul><ul><li>Garantiza acceso a datos compartido se realice sólo a través de los procedimientos definidos para su acceso </li></ul>
  3. 3. Ilustración de un Monitor Datos compartidos Procedimientos Código de Inicialización Cola de hebras para usar Monitor Sólo una hebra en Monitor al mismo tiempo
  4. 4. Cómo controla acceso Monitor <ul><li>Exclusión mutua </li></ul><ul><ul><li>Sólo una hebra/proceso puede estar ejecutándose dentro del monitor </li></ul></ul><ul><ul><ul><li>Sincronización esta implícita en el monitor </li></ul></ul></ul><ul><ul><li>Si una hebra/proceso trata de entrar al monitor cuando esta ocupado, entonces se bloquea hasta que se desocupe </li></ul></ul><ul><ul><ul><li>Más restrictivo que semáforos </li></ul></ul></ul><ul><ul><ul><li>Más fácil de usar </li></ul></ul></ul><ul><ul><li>Una vez dentro de un monitor una hebra puede verse incapacitada de continuar </li></ul></ul><ul><ul><ul><li>Permite a una que está esperando entrar a monitor </li></ul></ul></ul>
  5. 5. Variables de Condición <ul><li>Cuando hebra está dentro de un monitor </li></ul><ul><ul><li>si no puede continuar se bloquea </li></ul></ul><ul><ul><li>Si provee evento que eventualmente otra puede estar esperando notifica a posible hebra que espera que puede entrar al monitor </li></ul></ul><ul><li>Variables de Condición se usan para tal efecto </li></ul><ul><ul><li>Variables de condición pueden ser accesadas sólo desde dentro de un monitor </li></ul></ul><ul><li>Hay tres operaciones que se pueden realizar con variables de condición </li></ul>
  6. 6. Operaciones con Variables de Condición <ul><li>Una hebra/proceso puede realizar las siguientes operaciones con variables de condición </li></ul><ul><ul><li>Wait(var_cond) </li></ul></ul><ul><ul><ul><li>libera lock del monitor y se bloquea </li></ul></ul></ul><ul><ul><ul><li>espera por otra hebra que le active (signal) la condición var_cond. (cuando es despertada recupera lock) </li></ul></ul></ul><ul><ul><ul><li>variables de condición tienen asociadas cola de espera por var_cond </li></ul></ul></ul><ul><ul><li>Signal(var_cond) </li></ul></ul><ul><ul><ul><li>despierta una (si hay) hebra/proceso esperando por var_cond </li></ul></ul></ul><ul><ul><ul><li>signal se pierde si nadie espera por var_cond </li></ul></ul></ul><ul><ul><ul><li>Hoare: hebra que notifica inmediatamente entrega lock a hebra que despierta </li></ul></ul></ul><ul><ul><ul><li>Mesa: hebra que notifica mantiene lock y procesador (requiere signal sea última instrucción despues de salir de procedimiento) </li></ul></ul></ul><ul><ul><li>broadcast(var_cond) </li></ul></ul><ul><ul><ul><li>despierta todos las hebras esperando por var_cond </li></ul></ul></ul>
  7. 7. Monitores, incluyendo variables de condición lock Var cond1 Var cond2 Procedimientos monitor Cola espera monitor Colas esperas Variables de condición
  8. 8. Cómo resolver problemas con monitores? <ul><li>Identificar restricciones inherentes al problema </li></ul><ul><li>Identificar datos a encapsular en monitor </li></ul><ul><li>Definir procedimientos que accesarán datos </li></ul><ul><li>Identificar condiciones de espera y señalización, asociar a variables de condición </li></ul><ul><ul><li>Identificar condiciones por las cuales hebras podrían necesitar para ejecutarse exitosamente en procedimientos </li></ul></ul><ul><ul><li>Identificar condiciones que se pueden producir en procedimientos que podrían necesitar otras hebras </li></ul></ul><ul><li>Escribir los algoritmos </li></ul>
  9. 9. Ejemplo productor/consumidor <ul><li>Identificar restricciones inherentes al problema </li></ul><ul><ul><li>Las mismas que para el caso con semáforos (el problema es el mismo) </li></ul></ul><ul><li>Identificar datos a encapsular por monitor </li></ul><ul><ul><li>Buffer, in, out, contador </li></ul></ul><ul><li>Identificar procedimientos </li></ul><ul><ul><li>Ingresar: llamado por productores, manipular in, buffer y contador en forma exclusiva </li></ul></ul><ul><ul><li>Remover: llamado por consumidores, manipular out, buffer y contador en forma exclusiva </li></ul></ul><ul><li>Identificar condiciones de espera y señalización </li></ul><ul><ul><li>Productor necesita esperar si buffer está lleno </li></ul></ul><ul><ul><li>Productor debe señalizar a consumidor después de ingresar un elemento (consumidor puede estar esperando por uno buffer estaba vacío) </li></ul></ul><ul><ul><li>Consumidor necesita esperar si buffer está vacío </li></ul></ul><ul><ul><li>Consumidor debe señalizar a productor después de sacar un elemento de buffer (productor puede estar esperando por posición vacía) </li></ul></ul><ul><ul><li>Variables de condición. Not_empty y not_full. </li></ul></ul><ul><ul><ul><li>Productor espera por condición not_full y señaliza condición not_empty despues de ingresar un elemento. </li></ul></ul></ul><ul><ul><ul><li>Consumidor espera por condición not_empty y señaliza condición not_full, despues de sacar un elemento </li></ul></ul></ul>
  10. 10. 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 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); } }
  11. 11. Tipos de Monitores <ul><li>Qué significa operación signal? </li></ul><ul><ul><li>Monitores de Hoare </li></ul></ul><ul><ul><ul><li>Ejecutar hebra que espera inmediatamente </li></ul></ul></ul><ul><ul><ul><li>Hebra que notifica se bloquea inmediatamente </li></ul></ul></ul><ul><ul><ul><ul><li>condición garantizada para cuando hebra que esperaba se ejecute </li></ul></ul></ul></ul><ul><ul><ul><ul><li>hebra que notifica debe restaurar invariantes de monitor antes de notoficar </li></ul></ul></ul></ul><ul><ul><li>Monitores Mesa </li></ul></ul><ul><ul><ul><li>Hebra que espera se prepara para ejecutar, pero hebra que notifica sigue en ejecución </li></ul></ul></ul><ul><ul><ul><ul><li>hebra que espera se ejecuta cuando hebra que notifica sale de monitor </li></ul></ul></ul></ul><ul><ul><ul><ul><li>condición puede ser falsa cuando hebra que esperaba se ejecuta </li></ul></ul></ul></ul><ul><ul><ul><li>Hebra que notifica no necesita restaurar invariantes de monitor </li></ul></ul></ul><ul><ul><ul><li>Hebra que esperaba debe volver a verificar por condición </li></ul></ul></ul>
  12. 12. Ejemplos con los dos tipos <ul><li>Monitors de Hoare </li></ul><ul><ul><li>if (not_ready) </li></ul></ul><ul><ul><ul><li>wait(var_cond) </li></ul></ul></ul><ul><li>Monitors de Mesa </li></ul><ul><ul><li>while(not_ready) </li></ul></ul><ul><ul><ul><li>wait(var_cond) </li></ul></ul></ul><ul><li>Monitores de Mesa son más fáciles de usar </li></ul><ul><ul><li>más eficiente, menos cambios, soporta broadcast directamente </li></ul></ul><ul><li>Monitores de Hoare </li></ul><ul><ul><li>condición está garantizada de ser verdadera cuando hebra que espera se ejecuta </li></ul></ul>
  13. 13. Monitores en Java <ul><li>Del tipo Mesa </li></ul><ul><li>Métodos deben ser declarados con palabra clave “synchronized” </li></ul><ul><li>Variables de condición son anónimas </li></ul><ul><li>Operaciones </li></ul><ul><ul><li>wait() corresponde a wait(var_cond) </li></ul></ul><ul><ul><li>notify() corresponde a signal(var_cond) </li></ul></ul><ul><ul><ul><li>despierta una hebra esperando por condición. No garantía de que sea la que h aesperado por más tiempo </li></ul></ul></ul><ul><ul><li>notifyAll() corresponde a broadcast(var_cond) </li></ul></ul><ul><ul><ul><li>todas las hebras esperando condición despiertan. Cualquiera de ellas puede ejecutarse </li></ul></ul></ul>
  14. 14. Variables de Condición y Mutex Caso pthreads <ul><li>Otra construcción </li></ul><ul><ul><li>Variables de condición pueden ser usadas con mutexes </li></ul></ul><ul><ul><li>pthread_mutex_t mutex; </li></ul></ul><ul><ul><li>pthread_cond_t var_cond; </li></ul></ul><ul><ul><li>boolean ready; </li></ul></ul><ul><ul><li>void any(){ </li></ul></ul><ul><ul><li>pthread_mutex_lock(&mutex); </li></ul></ul><ul><ul><li>if(!ready) </li></ul></ul><ul><ul><li>pthread_cond_wait(&var_cond, &mutex); </li></ul></ul><ul><ul><li>… . </li></ul></ul><ul><ul><li>ready= TRUE; </li></ul></ul><ul><ul><li>pthread_cond_signal(&var_cond); </li></ul></ul><ul><ul><li>pthread_mutex_unlock(&mutex); </li></ul></ul><ul><ul><li>} </li></ul></ul>
  15. 15. Resumen <ul><li>Monitores de nivel más alto que semáforos </li></ul><ul><ul><li>Permiten relacionar datos con primitiva de sincronización </li></ul></ul><ul><ul><li>Un lock por monitor, hebras pueden salir entrar de monitor temporalmente según condiciones </li></ul></ul><ul><li>Deben ser soportados por lenguaje de programación </li></ul><ul><ul><li>Exclusión mutua garantizada por compilador </li></ul></ul><ul><ul><li>Aunque es posible usar locks y variables de condición </li></ul></ul><ul><li>Menos flexible </li></ul><ul><ul><li>Estructura de datos bien definida </li></ul></ul>

×