Programación Concurrente y Distribuida - Monitores - PDF
Document Details
![PreferableGingko](https://quizgecko.com/images/avatars/avatar-5.webp)
Uploaded by PreferableGingko
Universidad Europea de Madrid
Alfonso Antolínez García
Tags
Summary
Presentación sobre programación concurrente y distribuida, centrada en los monitores y sus características. Se explican las ventajas de su uso, comparándolos con otros mecanismos, mostrando ejemplos y un ejercicio propuesto. La presentación no parece ser un examen ya que no presenta preguntas.
Full Transcript
Programación Concurrente y Distribuida Unidad 2. Tema 11 Monitores Alfonso Antolínez García ® 1 Programación Concurrente y Distribuida Monitores Programación Concurrente y Distribuida Monitores Introducción Los monitores se utilizan para lo...
Programación Concurrente y Distribuida Unidad 2. Tema 11 Monitores Alfonso Antolínez García ® 1 Programación Concurrente y Distribuida Monitores Programación Concurrente y Distribuida Monitores Introducción Los monitores se utilizan para lograr la exclusión mutua y la sincronización entre procesos/hilos. Programación Concurrente y Distribuida Monitores Introducción El hecho de que existan procesos que se ejecutan de forma concurrente para resolver problemas y acceder a recursos compartidos origina problemas de sincronización. Los monitores buscan dar solución a los problemas de sincronización entre procesos/hilos/threads. Los problemas de sincronización que se pueden abordar con monitores también se pueden solucionar mediante los semáforos. Programación Concurrente y Distribuida Monitores Introducción Los monitores surgen de la intención de mejorar el concepto de los semáforos, ya que los semáforos: - Son globales, lo que implica no modularidad. - Uso y función de la variable no explícito. - Operaciones sobre variables y recursos no protegidos. - No poseen un acceso estructurado. Todo lo anterior es una fuente de errores. Programación Concurrente y Distribuida Monitores Introducción Los semáforos nos permiten resolver problemas de sincronización y exclusión mutua, pero… - Tienen difícil aplicación en problemas complejos: - Basados en variables globales, impiden diseño modular adecuado. - Controlar que semáforos se están utilizando para sincronización y cuáles para exclusión mutua. - Operaciones wait y signal dispersas. La supresión/adición de una nueva puede provocar interbloqueos. - La mayoría de lenguajes no disponen de mecanismos en tiempo de compilación que nos protejan del uso indebido de las variables empleadas en un programa concurrente. - Mantenimiento costoso, en definitiva: propensos a errores Programación Concurrente y Distribuida Monitores Introducción Los monitores proporcionan mecanismos más sencillos para algunos de los problemas de la sincronización. Presentan ventajas con respecto a utilizar mecanismos de bajo nivel (espera activa, semáforos, etc. ) - Son un mecanismo de alto nivel para programación concurrente - Los monitores son sinónimo de encapsulación Podríamos decir que un monitor es una instancia de una clase que puede ser usada de forma segura por múltiples threads - Todos los métodos de un monitor deben ejecutarse en exclusión mutua - Habrá únicamente un proceso accediendo a memoria compartida - Todos los accesos a memoria compartida se encuentran dentro de una misma clase Programación Concurrente y Distribuida Monitores Ventajas del uso de los monitores - Permiten definir la sincronización por condición de cada uno de los métodos del monitor - Permiten bloquear procesos hasta que se cumplan las condiciones para que puedan ejecutar - Permite notificar (señalizar) a un proceso bloqueado que puede continuar su ejecución cuando se cumplan las condiciones necesarias para ejecutar (Comunicación entre procesos). - No dependen del número de procesos que accedan - El “cliente” del monitor únicamente necesita conocer el interfaz/API del recurso - Los atributos (memoria compartida) del monitor únicamente serán accesibles desde dentro del monitor - La sincronización por condición también la realiza el monitor - Garantizar la exclusión mutua y la sincronización por condición ya no depende del thread que accede a la memoria compartida Programación Concurrente y Distribuida Monitores Ventajas del uso de los monitores - Permiten un desarrollo más “sistemático”. ○ No dependen de encontrar solución a un problema concreto. - Se puede demostrar su corrección mucho más fácilmente que con otros mecanismos de bajo nivel Programación Concurrente y Distribuida Comparativa entre Semáforos y Monitores Programación Concurrente y Distribuida Monitores Comparativa entre Semáforos y Monitores Semáforos: Recursos globales Código disperso por todos los procesos Las operaciones sobre los recursos no están restringidas Monitores: Recursos locales Código concentrado Los procesos invocan los procedimientos públicos Programación Concurrente y Distribuida Sintaxis del monitor Programación Concurrente y Distribuida Monitores Un monitor, es un módulo en el que se encapsulan datos, que son gestionados de forma excluyente por los procesos. Esto implica que, si se producen simultaneidades en la demanda de servicios, el monitor debe gestionar la exclusión mutua vía suspensión de los procesos invocados. Los monitores poseen la siguiente visión conceptual, donde se muestra la manera de estructurar y funcionar los procedimientos que poseen. Programación Concurrente y Distribuida Monitores 1. El monitor no tiene por qué exportar todos sus procedimientos, sino solo aquellos que sean públicos, manteniendo como privados aquellos a los que solo pueden acceder otros procedimientos definidos dentro del monitor. 1. El cuerpo del monitor contiene una secuencia de instrucciones de inicialización que se ejecutan una sola vez y antes de que se realice alguna llamada a los procedimientos del monitor. 1. Se denomina condiciones a la biblioteca donde se encuentra la definición de las variables de condición y de los procedimientos espera y señal de los monitores. Programación Concurrente y Distribuida Monitores Otras características de los monitores - Cada monitor posee una función específica. - Poseen datos e instrucciones propias. - Diferentes monitores o instancias de un monitor para diversas tareas. - Mayor eficiencia y a su vez mayor concurrencia. - Mayor robustez gracias a la modularidad. La entrada al monitor de un proceso excluye la entrada de otros. Es un único procesamiento sobre un recurso programado en el monitor Programación Concurrente y Distribuida Sincronización en monitores Programación Concurrente y Distribuida Monitores Al ser un mecanismo abstracto presenta el problema de la resolución de la exclusión mutua, por lo que hay que hacer uso de la sincronización. En el caso de los monitores, la sincronización la entendemos por la facilidad de bloqueo–activación a través de una condición. Programación Concurrente y Distribuida Monitores La semántica de las operaciones de bloqueo y activación, se presentan: Wait. Bloquea el proceso, donde se entiende que está preparado a que algo ocurra, condición. Signal. Reactiva un proceso bloqueado en esa condición, donde se están indicando que algo ha ocurrido. Programación Concurrente y Distribuida Monitores Sincronización sobre la exclusión mutua. Existen diferentes formas de reactivar los procesos mediante la señal signal. Reanudación inmediata: la operación signal debe de ir seguida inmediatamente de la reactivación de un proceso, sin que intervenga la llamada a un procedimiento de otro proceso. De esta manera se evita la inanición. Hoare propone: un proceso suspendido después de la ejecución del signal, debe acceder a una cola de suspendidos en signal. Cuando un proceso libere la exclusión mutua, se le dará prioridad de acceso a los procesos que estén en esta cola de signal que a los procesos que intentan acceder. Programación Concurrente y Distribuida Monitores Sincronización sobre la exclusión mutua. Existen diferentes formas de reactivar los procesos mediante la señal signal. Brinch Hansen propone: la instrucción signal debe de encontrarse al final del cuerpo, con lo que se evita la cola de suspendidos en signal y pasa a ser más eficiente. Programación Concurrente y Distribuida Exclusión mutua mediante monitores Programación Concurrente y Distribuida Monitores Ejemplo de código Java para lograr la exclusión mutua mediante monitores class Contador private int cuenta = 0; public void synchronized Increment() { int n = cuenta; cuenta = n+1; } // Usamos synchronized para indicar que la porción de código que incrementa “cuenta” debe ser secuencial // Cuando se ejecuta un método synchronized se impide que se empiece a ejecutar ningún otro que sea también synchronized. } Programación Concurrente y Distribuida Coordinación/sincronización a través de monitores en Java Programación Concurrente y Distribuida Monitores ¿Cómo se logra la coordinación/sincronización a través del Monitor? Conceptos clave: Monitor: Un monitor en Java es un mecanismo intrínseco que proporciona sincronización para acceder a un objeto. Cada objeto en Java tiene un monitor (también llamado bloqueo), y sólo un subproceso puede mantener el monitor (bloqueo) a la vez. Conjunto/cola de espera: El conjunto de espera es una colección de subprocesos que esperan que se cumpla una condición particular. Los subprocesos se agregan a este conjunto cuando llaman a wait(). Programación Concurrente y Distribuida Monitores Sincronización y coordinación mediante el monitor en Java La sincronización en Java se logra utilizando el monitor asociado a un objeto, que es un mecanismo para controlar el acceso de los subprocesos a los recursos compartidos. El mecanismo de "esperar y notificar" o "señalar y continuar" es clave para coordinar las interacciones de los subprocesos en Java. Programación Concurrente y Distribuida Monitores Sincronización y coordinación mediante el monitor en Java Cuando varios subprocesos necesitan operar sobre recursos compartidos, la sincronización es crucial para evitar condiciones de competencia/carrera (por los recursos). Por ejemplo, en el problema productor-consumidor, un subproceso produce datos y otro los consume. Una sincronización adecuada garantiza que el consumidor solo consuma datos cuando el productor los haya producido. Programación Concurrente y Distribuida Monitores Sincronización y coordinación mediante el monitor en Java El papel de los métodos wait(), notify() y notifyAll(): Un subproceso que necesita esperar a que se cumpla alguna condición por ejemplo, que un recurso esté disponible, puede llamar al método wait() en el monitor del objeto. Cuando esto sucede: El subproceso se suspende y se coloca en el conjunto/cola de espera del objeto. Programación Concurrente y Distribuida Monitores Sincronización y coordinación mediante el monitor en Java El hilo permanece en el conjunto/cola de espera hasta que otro hilo le indica que se despierte utilizando los métodos notify() o notifyAll(). Programación Concurrente y Distribuida Monitores Sincronización y coordinación mediante el monitor en Java wait(): El método wait() suspende el hilo actual y lo agrega al conjunto de espera del objeto. El hilo permanecerá en el conjunto de espera hasta que otro hilo invoque notify() o notifyAll() en el mismo objeto. Importante destacar que el hilo libera el bloqueo en el objeto cuando llama a wait(), lo que permite que otros hilos adquieran el bloqueo y potencialmente realicen operaciones que podrían cambiar la condición que el hilo en espera está esperando. Programación Concurrente y Distribuida Monitores Sincronización y coordinación mediante el monitor en Java notify(): El método notify() despierta un hilo que está esperando en el monitor del objeto (conjunto de espera). El hilo que se despierta lo determina la JVM y puede parecer arbitrario. El hilo despertado aún debe volver a adquirir el bloqueo en el objeto antes de continuar. El orden en el que se notifican los hilos no es determinista. Programación Concurrente y Distribuida Monitores Sincronización y coordinación mediante el monitor en Java notifyAll(): El método notifyAll() despierta todos los hilos que están esperando en el monitor del objeto (conjunto de espera). Esto es útil cuando varios subprocesos están esperando que cambie una condición y cualquiera de ellos podría continuar. Al igual que con notify(), los subprocesos activados deben volver a adquirir el bloqueo antes de continuar. La JVM permitirá que los subprocesos compitan por el bloqueo una vez que reciban la notificación. Programación Concurrente y Distribuida Monitores Ejemplo productor-consumidor Un productor genera datos y los agrega al búfer mediante Put. Un consumidor procesa los datos recuperándolos del búfer mediante Get. Programación Concurrente y Distribuida Monitores Ejemplo productor-consumidor Programación Concurrente y Distribuida Monitores Ejemplo productor-consumidor Limitando la salida a 10 el consumo de mensajes Programación Concurrente y Distribuida Monitores Ejemplo productor-consumidor La clase Buffer simula un búfer compartido con un tamaño fijo. Permite que un productor agregue elementos y que un consumidor los consuma, al tiempo que garantiza la seguridad de los subprocesos mediante bloques sincronizados. Esto garantiza que el productor y el consumidor operen en coordinación, lo que evita el desbordamiento del búfer. Put(char c): Agrega un carácter al búfer. Si el búfer está lleno (count == buffer.length), el subproceso del productor espera utilizando wait(). Después de agregar el elemento, incrementa count, actualiza el índice de entrada y notifica a otros subprocesos que esperan (notify()). Get(): Elimina un carácter del búfer. Si el búfer está vacío (count == 0), el subproceso del consumidor espera utilizando wait(). Después de eliminar el elemento, disminuye count, actualiza el índice de salida y notifica a otros subprocesos. Programación Concurrente y Distribuida Ejercicio propuesto Programación Concurrente y Distribuida Monitores Ejercicio propuesto con monitores en Java El objetivo es implementar un recurso compartido implementándolo con un monitor Usando el enunciado de la actividad 1, ”Sokects en Java”, modifica el código tal que: - Permita crear dos hilos desde el cliente para abrir dos conexiones en forma de exclusión mutua usando monitores de Java - El socket de conexión será considerado un recurso compartido de uso individual por cada hilo creado - Cada hilo establecerá una conexión con el servidor y los monitores asegurarán la sincronización - Si es necesario, modifica la aplicación servidor para que gestione varias conexiones Computación en Sistemas Distribuidos ¡Muchas Gracias! ¿Preguntas?