1 / 18

Monitores

Monitores. Programación Concurrente y Paralela. Definición. Un monitor es un conjunto de procedimientos que proporciona el acceso con exclusión mutua a un recurso o conjunto de recursos (datos o dispositivos) compartidos por un grupo de procesos.

indra
Download Presentation

Monitores

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Monitores Programación Concurrente y Paralela

  2. Definición • Un monitor es un conjunto de procedimientos que proporciona el acceso con exclusión mutua a un recurso o conjunto de recursos (datos o dispositivos) compartidos por un grupo de procesos. • Los procedimientos van encapsulados dentro de un módulo que tiene la propiedad especial de que sólo un proceso puede estar activo cada vez para ejecutar un procedimiento del monitor. • Es activado (o utilizado) mediante llamadas desde los procesos.

  3. Monitor: la estructura y la sintaxis Monitor<nombre> { public: <lista_Proc_Públicos>; private: <decl_Recurso_Priv>; <implementación_Proc> body: <inic_Val_Recursos>; } Recursos Privados Procedimientos Públicos (Procedimientos Privados) Cuerpo Negociación Liberación Estructura del Monitor

  4. Sintaxis del Monitor Nombre o Indentificador Lista de los procedimientos que Pueden invocar los procesos. Ej. public: sumar, restar; Declaración de los recursos privados que los procesos utilizaran para Comunicarse y sincronizarse Ej. private: int X; float totalCant; Implementación de los Procedimientos públicos y privados del monitor Sintaxis <tipo> <nomb>(<par>) { <sent>; } Ej: int sumar(int a,b) { return a+b; } Invocación: <nombMon>.<nomProc> El cuerpo es el conjunto de sentencias para inicializar los recursos Monitor<nombre> { public: <lista_Proc_Públicos>; private: <decl_Recurso_Priv>; <implementación_Proc> body: <inic_Val_Recursos>; }

  5. ¿Cómo funciona el monitor? • Los procesos, cuando desean comunicarse o sincronizarse utilizan los recurso privados del Monitor, mediante invocación de los procedimientos públicos. • Antes de que se pueda ejecutar ningún procedimiento del Monitor se ejecuta el cuerpo. • Si un proceso invoca un procedimiento de un Monitor, y no existe ningún otro proceso ejecutando alguno de sus procedimientos, éste proceso bloquea y ocupa el Monitor, ejecuta el procedimiento. • Si un proceso invoca algún procedimiento del Monitor, y éste está ocupado, el proceso queda bloqueado en una cola asociada al Monitor • Cuando un proceso finaliza la ejecución de un procedimiento del Monitor, se analiza la cola del Monitor, seleccionando el primer proceso bloqueado en ella.

  6. Variable Condición • Una variable que se utilice como mecanismo de sincronización en un monitor se conoce como variable de condición. • Un proceso deba esperar se asocia una variable de condición. Sobre ellas sólo se puede actuar con dos • procedimientos: espera y señal. En este caso, cuando un proceso ejecuta una operación de espera se suspende y se coloca en una cola asociada a dicha variable de condición. • La diferencia con el semáforo estriba en que ahora la ejecución de esta operación siempre suspende el proceso que la emite. La suspensión del proceso hace que se libere la posesión del monitor, lo que permite que entre otro proceso.

  7. ¿Cómo trabaja el monitor? • Cuando un proceso ejecuta una operación de señal se libera un proceso suspendido en la cola de la variable de condición utilizada. Si no hay ningún proceso suspendido en la cola de la variable de condición invocada la operación señal no tiene ningún efecto. • El monitor no tiene por qué exportar todos sus procedimientos sino sólo aquellos que sean públicos y manteniendo como privados aquellos a los que sólo pueden acceder otros procedimientos definidos dentro del monitor.

  8. ¿Cómo trabaja el monitor? • El primer proceso que realiza una invocación a la operación sespera puede acceder al recurso controlado por el monitor y como la variable ocupado se pone a verdadero, cualquier otro proceso que ejecute la operación sespera debe esperar a que se ejecute una operación sseñal para poder acceder al recurso. • Cuando esto ocurre la variable ocupado pasa a tener el valor falso y la condición libre recibe una señal, lo que hace que uno de los procesos que esperan en su cola pase a completar la ejecución de sespera y pueda acceder al recurso. Ejecuciones sucesivas de sseñal van despertando a procesos en espera hasta que no haya más procesos en la cola de la condición libre. Cuando no hay ningún proceso en espera de la variable de condición la ejecución de sseñal sólo tiene por efecto poner la variable ocupado a false, lo que permite que el primer proceso que ejecute sespera pueda acceder al recurso.

  9. Ejemplos clásicos • Filósofos N(=5) Procesos: Pensar - Comer MONITOR Palillos Disponibles de Cada Filósofo Coger Palillos Dejar Palillos

  10. Monitor CtrlPalillos {   public cogerPalillos, dejarPalillos; private int numPalillos[5]; condition dormir[5]; void cogerPalillos(int filosofo) { if (numPalillos[filosofo] != 2) dormir[filosofo].delay(); numPalillos[ (filofoso+5-1)%5 ]--; numPalillos[ (filofoso+1)%5 ]--; } void dejarPalillos(int filosofo) { numPalillos[ (filofoso+5-1)%5 ]++; numPalillos[ (filofoso+1)%5 ]++; if (numPalillos[(filofoso+5-1)%5]==2) dormir[(filofoso+5-1)%5].resume(); if (numPalillos[(filofoso+1)%5 ]==2) dormir[(filofoso+1)%5].resume(); } Body: for(int i=0;i<5;i++) numPalillos=2; }

  11. Exclusión Mutua en Java • Simulación de un Monitor class ejMonitor { // Atributos privados // Métodos Synchronized públicos public synchronized void met1() { // código synchronized } ... public synchronized void metN() { // código synchronized } }

  12. Sincronización en Java Los objetos en Java disponen de un mecanismo parecido (aunque con diferencias) a las variables de condición de los Monitores • Cada objeto sólo dispone de una variable de condición, denominada conjunto de espera (wait set). • Un hilo que haya adquirido el “cerrojo” del objeto puede detenerse en ella. Liberando el cerrojo. • Los hilos detenidos en una espera, cuando son seleccionados deben competir, de nuevo, por el “cerrojo”. • Bloqueo en el conjunto de espera: wait(); • ... • try { wait(); • } catchg (InterruptedException e) { } • ... • Activación de un hilo del conjunto de espera: notify() o notifyAll()

  13. Sincronización en Java Uso tradicional while ( ! cond ) { try { wait(); }catch(InterruptedException e) {} } try-catch: el método wait puede lanzar un excepción en caso de producirse una interrupción. while (en lugar de if): - Los hilos deben volver a adquirir el cerrojo - Existe una única variable de condición

  14. Diferencias entre Monitores y el Modelo Java • Semántica de c.resume() vs notify() Monitor: Un proceso despertado tiene preferencia sobre otros que desean acceder al Monitor Java: Un hilo despertado debe volver a adquirir el cerrojo, no garantizándose su continuación inmediata • Objetos vs Variables de Condición Monitor: Facilidad de utilización de múltiples variables de condición. Java: Un objeto sólo dispone de un conjunto de espera La simulación de múltiples conjuntos de espera requiere gran habilidad del programador

  15. Ventajas de Monitores • Enfoque Modular • Facilidad de uso • Inconvenientes • Modelo de sincronización • Mejora • Monitor (Exclusión Mutua) + RCC (Sincronización)

  16. Métodos de espera y notificaciónJava • En Java no existe el concepto de variable condición. Podríamos decir que cada monitor en Java tiene una única variable condición anónima. Los monitores de Java implementan la disciplina signal and continue. • Los metodoswait(), notify() y notifyAll() implementan los mecanismos de espera y notificación de los monitores Java. Estos métodos solamente pueden ser llamados por una hebra cuando esta posee el cerrojo del objeto, es decir, desde un bloque o un método sincronizado.

  17. La invocacion al metodowait() provoca que la hebra actual se bloquee y sea colocada en una cola de espera asociada al objeto monitor. El cerrojo del objeto es liberado, para que otras hebras puedan ejecutar métodos del objeto. Sin embargo, otros cerrojos poseidos por la hebra suspendida son retenidos por esta. • La invocacion al metodonotify() provoca que, si hay alguna hebra bloqueada en wait(), se escoja una cualquiera de forma arbitraria, y se saque de la cola de wait() pasando esta al estado preparado. • La hebra que invoco notify() seguirá ejecutándose dentro del monitor. La hebra señalada deberá adquirir el cerrojo del objeto para poder ejecutarse. • Esto significara esperar al menos hasta que la hebra que invoco notify() libere el cerrojo, bien por la ejecución de una llamada a wait(), o bien por la salida del monitor. La hebra señalada no tiene prioridad alguna para ejecutarse en el monitor.

  18. Puede ocurrir que, antes de que la hebra señalada pueda volver a ejecutarse, otra hebra adquiera el cerrojo del monitor. • La invocación al método notifyAll() produce el mismo resultado que una llamada a notify() por cada hebra bloqueada en la cola de wait(): todas las hebras bloqueadas pasan al estado preparado

More Related