martes, 6 de septiembre de 2011

Semáforos, Monitores y Mensajes

Semáforo:

Es un tipo de variable usado para guardar el número de señales enviadas para despertar un proceso. Su valor puede ser cero o un valor positivo que indica el número de señales pendientes para despertar el proceso.

Se establecieron dos operaciones:

La operación bajar comprueba si el valor es mayor que cero, si lo es decrementa el valor, es decir, usa una de las señales guardadas. Si el valor es cero el proceso puede dormirse.
La comprobación del valor del semáforo, su modificación y la posible acción de dormirse se realizan como una única acción atómica, resolviendo los problemas de sincronización.

La operación subir incrementa el valor del semáforo. Si uno o más procesos estuviesen dormidos sobre ese semáforo, incapaces de completar una anterior operación bajar, el sistema elige uno de ellos aleatoriamente y le permite completar esa operación bajar pendiente. Luego de ejecutarse un subir en un semáforo con procesos dormidos en él, el semáforo sigue valiendo cero pero tendrá un proceso dormido menos. La operación subir también es indivisible.

Monitores:

Un monitor es una colección de procedimientos, variables y estructuras de datos que están todos agrupados juntos en un tipo especial de módulo o paquete. Los procesos pueden llamar a los procedimientos de un monitor siempre que quieran, pero no se les permite acceder directamente a las estructuras de datos internas del monitor desde procedimientos declarados fuera del monitor.

Problemas con los monitores
Fueron diseñados para resolver el problema de la exclusión mutua sobre una o más CPUs que tienen acceso a una memoria común.
Los monitores no están disponibles más que en unos pocos lenguajes de programación.
Además, no proporciona intercambio de información entre diferentes máquinas.

Paso de mensajes:

Éste método de comunicación entre procesos utiliza dos primitivas, enviar y recibir, que al igual que los semáforos y a diferencia de los monitores, son llamadas al sistema en vez de construcciones del lenguaje de programación. El envío de un mensaje debe tener el destinatario, mientras que la recepción puede no tener remitente.

Los mensajes pueden comunicar procesos que residen en máquinas diferentes conectadas por una red, para evitar la pérdida del mensaje el receptor envía un acuse de recibo. Si el remitente no recibe el mensaje de acuse dentro de un intervalo de tiempo puede retransmitir el mensaje. Es esencial que el receptor sea capaz de distinguir un nuevo mensaje de la retransmisión de uno antiguo. Esto se resuelve añadiendo números de secuencia consecutivos a cada mensaje original.

Cuando el remitente y el receptor están en la misma máquina, copiar los mensajes de un proceso a otro es más lento que hacer una operación sobre un semáforo o entrar en un monitor. Para conseguir que el paso de mensajes sea eficiente se sugirió realizar el paso de mensajes utilizando los registros de máquina.


Referencia: Sistemas Operativos Modernos, Andrew S. Tanenbaum, Páginas 110-122

No hay comentarios:

Publicar un comentario