MONITORES

MONITORES.

Los semáforos son una herramienta básica, pero potente y flexible, para hacer cumplir la exclusión mutua y coordinar procesos. Sin embargo, puede resultar muy difícil construir un programa correcto por medio de semáforos. La dificultad está en que las operaciones wait y signal deben distribuirse por todo el programa y no es fácil advertir el efecto global de estas operaciones sobre los semáforos a los que afectan. En los semáforos, tanto la exclusión mutua como la sincronización son responsabilidades del programador. Los monitores son estructuras de un lenguaje de programación que ofrecen una funcionalidad equivalente a la de los semáforos y que son más fáciles de controlar.

Los monitores fueron propuestos por Brich Hansen y mejorados por Hoare para poder utilizar procesos automáticos de sincronización. Un módulo monitor encapsula la mutua exclusión de datos y procedimientos que pueden acceder a los datos protegidos. Los usuarios pueden hacer llamadas a estos procedimientos usando al monitor como una tabla de estado para determinar cuando proceder y cuando suspender operaciones.

Monitores con señales

Un monitor es un módulo de software que consta de uno o más procedimientos, una secuencia de inicialización y unos datos locales. Las características básicas de un monitor son las siguientes:

  1. Las variables de datos locales están sólo accesibles para los procedimientos del monitor y no para procedimientos externos.
  2. Un proceso entra en el monitor invocando a uno de sus procedimientos.
  3. Sólo un proceso puede estar ejecutando en el monitor en un instante dado; cualquier otro proceso que haya invocado al monitor quedará suspendido mientras espera que el monitor esté disponible.

Solamente una llamada a un módulo monitor puede ser activada por vez. Esto protege a los datos dentro del monitor de accesos simultáneos de múltiples usuarios. Los usuarios que intentan acceder al monitor mientras este está ocupado son bloqueados en una cola de entrada al monitor.

CWAIT(c): Suspende la ejecución del proceso llamado bajo la condición c. El monitor está ahora disponible para ser usado por otro proceso.

CSIGNAL(c): Reanuda la ejecución de algún proceso suspendido después de un CWAIT() bajo la misma condición. Si hay varios procesos, elige uno de ellos; si no hay ninguno, no hace nada.

Los operadores de sincronización del monitor son llamados CWAIT() y CSIGNAL() de la misma manera que en programas basados en semáforos. Sin embargo variables de condición son usadas en lugar de semáforos y su comportamiento es diferente. Por ejemplo, definen simplemente la cola de espera y no tienen valores numéricos como los semáforos. En cualquier momento que una condición variable CWAIT() es encontrada, el proceso ejecutando el CWAIT() está siempre bloqueado. En cualquier momento que un CSIGNAL() es encontrado en una condición variable, un proceso esperando en la cola de condiciones variables (el primero si es FIFO) es activado (puesto en la cola de listos). Si no hay procesos esperando, el operador CSIGNAL() es ignorado.

Es importante destacar que un proceso con la marca CSIGNAL() debe ser el próximo en entrar al monitor para que las condiciones existentes cuando ocurrió el CSIGNAL() no sean cambiadas cuando éste entre al monitor. También, cuando no hay procesos bloqueados en la cola de condiciones variables CSIGNAL(), pero hay procesos bloqueados en la cola de entrada al monitor, CSIGNAL() activará “la cabeza” de la cola de entrada al monitor pasándole el control del monitor.

Si hay al menos un proceso en una cola de condición, un proceso de dicha cola deberá ejecutar en cuanto otro proceso ejecute un CSIGNAL() para la condición. Así pues, el proceso que ejecuta el CSIGNAL() debe salir inmediatamente del monitor o suspenderse en el monitor. Son varios los inconvenientes de esta solución:

  1. Si el proceso que ejecuta el CSIGNAL() no abandona el monitor, hacen falta dos cambios de contexto adicionales: uno para suspender el proceso y otro para reanudarlo cuando el monitor quede disponible.
  2. Cuando se ejecuta un CSIGNAL(), debe activarse inmediatamente un proceso de la cola de la condición correspondiente y el planificador debe asegurarse de que ningún otro proceso entre al monitor antes de la activación. Si no es así, la condición bajo la que se ha activado el proceso podría cambiar.

 

      Se puede utilizar el paso de mensajes para cumplir con la exclusión mutua. Esta técnica dice que si hay más de un proceso ejecutando la acción receive concurrentemente, entonces:

Si hay un mensaje, se entrega sólo a uno de los procesos y los otros se bloquean.

Si el buzón está vacío, todos los procesos se bloquean. Cuando haya un mensaje disponible, sólo se activa y toma el mensaje uno de los procesos bloqueados. Una vez que un proceso ha conseguido el mensaje, ejecuta su sección crítica y, después, devuelve el mensaje al buzón. De este modo, el mensaje funciona como un testigo (token) que se pasa de un proceso a otro.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: