lunes, 10 diciembre 2018

Exclusión de un Monitor

E-mail

 

Los monitores están pensados para ser usados en entornos multiproceso o multihilo, y por lo tanto muchos procesos o threads pueden llamar a la vez a un procedimiento del monitor. Los monitores garantizan que en cualquier momento, a lo sumo un thread puede estar ejecutando dentro de un monitor. Ejecutar, dentro de un monitor significa que sólo un thread, estará en estado de ejecución mientras dura la llamada a un procedimiento del monitor. El problema, de que dos threads ejecuten un mismo procedimiento dentro del monitor, es que se pueden dar condiciones de carrera, perjudicando el resultado de los cálculos.


MonitoresPara evitar esto y garantizar la integridad de los datos privados, el monitor hace cumplir la exclusión mutua implícitamente, de modo que sólo un procedimiento esté siendo ejecutado a la vez. De esta forma, si un thread, llama a un procedimiento mientras otro thread está dentro del monitor, se bloqueará y esperará en la cola de entrada hasta que el monitor quede nuevamente libre. Aunque, se la llama cola de entrada, no debería suponerse ninguna política de encolado.


Para que resulten útiles en un entorno de concurrencia, los monitores deben incluir algún tipo de forma de sincronización. Por ejemplo, supóngase un thread que está dentro del monitor y necesita que se cumpla una condición para poder continuar la ejecución. En ese caso, se debe contar con un mecanismo de bloqueo del thread, a la vez que se debe liberar el monitor para ser usado por otro hilo. Más tarde, cuando la condición permita al thread bloqueado continuar ejecutando, debe poder ingresar en el monitor en el mismo lugar donde fue suspendido. Para esto, los monitores poseen variables de condición que son accesibles sólo desde adentro. Existen, dos funciones para operar con las variables de condición:


1. Cond_wait(c): Suspende la ejecución del proceso que la llama con la condición c. El monitor se convierte en el dueño del lock y queda disponible para que otro proceso pueda entrar.


2. Cond_signal(c): Reanuda la ejecución de algún proceso suspendido con cond_wait bajo la misma condición. Si hay varios procesos con esas características elige uno. Si no hay ninguno, no hace nada.


Nótese que, al contrario que los semáforos, la llamada a cond_signal(c), se pierde si no hay tareas esperando en la variable de condición c. Las variables, de condición indican eventos, y no poseen ningún valor. Si un thread, tiene que esperar que ocurra un evento, se dice espera por (o en) la variable de condición correspondiente. Si otro thread provoca un evento, simplemente utiliza la función cond_signal con esa condición como parámetro. De este modo, cada variable de condición tiene una cola asociada para los threads que están esperando que ocurra el evento correspondiente. Las colas se ubican en el sector de datos privados visto anteriormente.

 
Red de Sitios Latinos
 
Latinos