Mensajes
Es un mecanismo que ofrece el sistema operativo para la sincronización y la comunicación de procesos. Puede ser una alternativa al uso de semáforos y monitores para lograr la sincronización.
El paso de mensajes puede implementarse cuando existe una memoria compartida por múltiples núcleos de procesador, como también puede ser usado en sistemas distribuidos a través de la red con dispositivos comunicados entre sí que deban ejecutar procesos concurrentes. Esta última situación es utilizada por tecnologías como Erlang o Elixir.
Ésta estrategia permite resolver el problema de la exclusión mutua y también la comunicación entre procesos. Por lo que es una buena alternativa para resolver los mismos problemas que los semáforos o los monitores (problema de productor/consumidor).
Operaciones
El primer paso para los mensajes son dos operaciones básicas. Enviar un mensaje y recibir un mensaje. Tanto enviar como recibir pueden bloquear o no bloquear el flujo de ejecución.
-
Enviar (send): Puede ser bloqueante o no bloqueante.
-
Recibir (receive): Puede ser bloqueante o no bloqueante.
send(destino, mensaje)
Puede tener un comportamiento bloqueante. Es decir el proceso se bloquea hasta saber que el mensaje fue recibido.
También puede tener un comportamiento no bloqueante. Es decir luego de enviar al mensaje se continúa con otras operaciones, sin esperar a que fuese recibido.
receive(origen, mensaje)
El recibir un mensaje también puede ser bloqueante. Es decir, el proceso se bloquea hasta que reciba un mensaje.
También puede ser no bloqueante, es decir, el proceso continúa ejecutándose despúes de realizar el intento de recepción de mensajes.
Combinaciones
Debido a las características bloqueantes o no bloqueantes se pueden dar las siguientes combinaciones de situaciones.
| Operación | Tipo 1 | Tipo 2 | Tipo 3 | Tipo 4 |
|---|---|---|---|---|
send |
bloqueante |
no bloqueante |
no bloqueante |
bloqueante |
receive |
bloqueante |
bloqueante |
no bloqueante |
no bloqueante |
Tipo 1
El emisor y receptor se bloquean hasta recibir el mensaje. Lo que significa una fuerte sincronización entre los procesos. Puede que tome más tiempo en llegar a un resultado, pero se tiene la garantía de que los procesos estarán sincronizados.
Tipo 2
El emisor puede continuar, el receptor estará bloqueado hasta recibir un mensaje. Hay una menor sincronización, puede que el emisor realice su proceso y el receptor reciba el mensaje de forma diferida, aunque existe la posibilidad de que se sincronicen.
Esta estrategia puede ayudar a solucionar el problema de la exclusión mutua o el problema de productor/consumidor.
Tipo 3
Tanto el emisor y receptor no son bloqueantes. Hay una menor probabilidad de sincronización, esto es más para la comunicación interprocesos. El emisor y receptor no se bloquean al esperar un mensaje y pueden continuar sus operaciones normalmente. Revisarán si tienen un mensaje en un periodo de tiempo específico y continuarán su flujo.
Direccionamiento
Además el envío de los mensajes puede ser directo o indirecto. Es decir, puede ser a un proceso específico (directo) o puede ser a un buzón (indirecto).
Directo
El direccionamiento directo es como llamar a un número telefónico directamente, se debe saber el identificador del proceso al cual se quiere enviar un mensaje. El receptor debe estar atento para recibir los mensajes ya que si no se está recibiendo, nunca podrá saber que ha recibido un mensaje.
-
La operación
sendincluye una identificación específica del proceso del destino. -
La operación
receivepuede incluir quién es el origen del mensaje o también puede no saber quién le enviará un mensaje.
Indirecto
El direccionamiento indirecto es a través de un buzón de mensajes, el cual puede ser leído por el receptor cuando tenga la oportunidad de leer los mensajes. Es una estructura de datos del tipo cola llamada "buzón" o "mailbox" que guarda los mensajes temporalmente. Para que exista la comunicación un proceso envía mensajes al buzón y otro toma mensajes del buzón. Existe un desacople del emisor y receptor. El receptor puede simplemente realizar sus operaciones sin necesidad de estar esperando mensajes.
-
La operación
sendenvía a un buzón de mensajes, no a un identificador de proceso. -
La operación
receivesolo espera mensajes al buzón, pero no es bloqueado.
Relaciones
Al tener un desacoplamiento puede haber distintas relaciones entre emisor y receptor.
-
Uno a Uno: Un emisor y un receptor leen un solo buzón de mensajes. Establece un enlace privado de comunicación entre dos procesos.
-
Muchos a Uno: Muchos emisores escriben al mismo buzón de mensajes y solo un receptor lee ese buzón de mensajes. Útil para relación cliente/servidor. El buzón es como una puerta de entrada.
-
Uno a Muchos: Un emisor envía a un buzón de mensajes que es leido por muchos receptores. Útil para aplicaicones donde se debe difundir la misma información entre varios procesos. Ejemplo un sistema de notificaciones grupal donde un solo emisor envía una notificación que llega a múltiples dispositivos.
-
Muchos a Muchos: Muchos emisores escriben al mismo buzón de mensajes y muchos receptores leen ese buzón de mensajes. Por ejemplo un grupo de foro donde múltiples personas pueden escribir y leer los mensajes.
Formato
El mensaje también necesita un formato que tenga para almacenar su contenido y cabeceras que indiquen información como su longitud fija o variable.
Este depende del servicio que espera los mensajes y puede ser distinto según la necesidad. Por ejemplo si está dentro del mismo computador se necesite un formato dependiendo del proceso que lo lea. Si es un sistema distribuido puede necesitar por ejemplo la dirección IP y cabeceras TCP/IP para el mensaje.
En general el mensaje consta de dos componentes fundamentales:
-
Cabecera (Header): Guarda información sobre el mensaje como origen, destino, longitud, tipo, control de accesos, prioridad, secuencia, entre otros.
-
Cuerpo (Body): Guarda el contenido del mensaje.
Disciplina de cola
Finalmente se debe definir cómo los mensajes son priorizados. ¿Qué mensaje se lee primero?.
En algunos casos es suficiente con una estrategia FIFO (Primero en entrar, primero en salir). Sin embargo no siempre los mensajes tienen la misma urgencia y relevancia. Por lo que también es importante priorizar según el emisor.
-
El buzón debe permitir priorizar los mensajes según el tipo de mensaje o el emisor del mismo.
-
El receptor debe poder examinar el buzón de mensajes libremente y seleccionar un mensaje específico.