Semáforos, monitores y paso de mensajes
Semáforos
Utiliza un sistema de señales para establecer requisitos de comunicación y sincronización a través de dos operaciones denominadas P y V. P se comporta como la operación de probar y V, la de incrementar.
Ahora bien, la operación V sobre una variable de tipo semáforo lo que hace es incrementar en uno el contenido de la variable. Si el valor no es positivo se desbloquea el proceso que ejecutó P sobre el semáforo. Mientras que la operación P, prueba el valor de la variable; pues, si es mayor de cero entonces disminuye en uno el valor de la variable, si es cero el proceso que ejecutó V sobre el proceso se bloquea. Las operaciones P y V no pueden ser interrumpidas.
Operación P (Sobre el semáforo S)
Si S>0
Entonces S:=S-1;
Sino (esperar S)
Operación V (Sobre el semáforo S)
Si (Uno o más procesos esperan S)
Entonces (dejar que prosiga uno de esos procesos)
Sino S:=S+1
Con las variables de tipo semáforo, el sistema operativo ejecuta operaciones P y V, respondiendo a las llamadas que realicen los procesos, evitando así que estos tengan el control. Si el semáforo se encuentra en cero, el proceso que llama con la operación P debe esperar hasta que el semáforo tenga un valor superior a cero. Regularmente se utiliza una política FCFS para los procesos que se encuentran esperando por el semáforo.
En consecuencia las operaciones P y V sobre una variable de tipo semáforo obligan al concepto de exclusión mutua.
Monitores
El uso de semáforos para cumplir la exclusión mutua suele ser potente y flexible. Sin embargo, las operaciones P y V, se esparcen a lo largo del programa dificultando el efecto global de las mismas sobre los semáforos que afectan. Debido a esto, se introduce el concepto de monitores que ofrecen una aplicación similar a la de los semáforos pero con la ventaja de que son más fáciles de manejar.
Siguiendo el concepto de programación modular, se tienen las siguientes características para un monitor:
- Las variables locales están disponibles para los procedimientos del monitor y no para procedimientos externos.
- Los procesos entran en el monitor utilizando uno de sus procedimientos.
- Solo un proceso puede estar utilizando el monitor en un instante.

(Para ampliar la imagen haga clic sobre ella)
Para que los monitores sean útiles en procesos concurrentes, deben incluir herramientas de sincronización, para esto se crean variables de condición que se encuentran dentro del monitor y que solo son accesibles dentro del mismo.
Existen dos funciones que operan las variables de condición, Wait y Signal, la primera suspende la ejecución del proceso bajo una condición específica y el monitor queda disponible para ser utilizado por otro proceso. La segunda, reanuda la ejecución del proceso suspendido con Wait bajo la misma condición. En el caso de que se encuentren varios procesos suspendidos por Wait, elige uno, de lo contrario no hace nada.
Paso de mensajes
Los requisitos de sincronización y comunicación de los procesos concurrentes, pueden lograrse simultáneamente a través del paso de mensajes. El cual tiene la ventaja que puede ser implementado en sistemas distribuidos, en sistemas multiprocesador y monoprocesador con memoria compartida.
Un conjunto mínimo de operaciones como Send (destino,mensaje) y Receive(origen,mensaje), permiten que los procesos puedan comunicarse a través del paso de mensajes. Esto significa que la comunicación entre dos procesos implica de cierto modo su sincronización.
Dado que tanto el emisor como el receptor pueden ser bloqueantes o no bloqueantes, cada sistema implementa solo una o dos combinaciones de las siguientes que se presentan:
- Envío bloqueante- recepción bloqueante: Receptor y emisor se bloquean hasta que se entrega el mensaje, permitiendo una sincronización perfecta de los procesos.
- Envío no bloqueante, recepción bloqueante: Suele ser la combinación más útil, en la cual el receptor se bloquea hasta recibir el mensaje solicitado, mientras el emisor continúa la ejecución normalmente. Regularmente un proceso, que debe recibir un mensaje para poder hacer alguna acción, se bloquea a la espera de la llegada del mismo.
- Envío no bloqueante, recepción no bloqueante: Nadie espera. Como no hay bloqueo, los mensajes pueden consumir demasiados recursos del sistema, incluidos tiempo de procesador y espacio de almacenamiento.
Para la operación Send, la versión bloqueante puede ser la más natural, mientras que para la operación Receive, la versión no bloqueante puede ser la más natural, en muchas tareas de programación concurrente.