Tenemos dos tipos de órdenes para gestionar mensajes (para enviar y recibir):
- Enviar: send (destino, mensaje)
- Recibir: receive (origen, mensaje)
*Direccionamiento.
a) Directo. Se especifican emisor y receptor de forma explícita.
P envía a Q:
- P send (Q, mensaje)
- Q receive (Q, mensaje)
b) Implícito: El emisor especifica quien es el receptor, pero el receptor no especifica quién es el emisor.
c) Indirecto. En este direccionamiento los mensajes no se envían directamente al receptor, sino que se envían a una estructura de datos denominada buzón o mailbox. Una gran ventaja de esto es que podemos enviar a cualquier buzón cualquier mensaje. Los mensajes no tienen que ir dirigidos específicamente a un proceso.
En este tercer caso la relación puede ser (1-1) (un proceso envía a un solo buzón). También puede haber (n-1) donde varios procesos envían mensajes a un solo buzón o (1-n) donde un proceso envía mensajes a muchos buzones. Este último caso vale para cuando quiero comunicar una información a muchos procesos.
* Propiedad de los buzones.
Tenemos dos casos:
- El proceso es el propietario. El buzón existe mientras existe el proceso y sólo el propietario puede leer datos del buzón
- El propietario del buzón es el SO. La propiedad del buzón puede transmitirse entre procesos, lo que permite que varios procesos puedan leer.
* Sincronización de los mensajes.
a) cuando enviamos:
- El proceso se bloquea hasta que el receptor reciba el mensaje (envío bloqueante)
- No se bloquea y continua haciendo operaciones (envío no bloqueante)
b) Al recibir el mensaje:
- Al mirar a ver si está el mensaje, si ya ha llegado, lo cojo y continúo.
- Cuando voy a buscar el mensaje, si no ha llegado todavía:
- Bloqueo el proceso, hasta que llegue el mensaje (recepción bloqueante).
- No se bloquea el proceso (recepción no bloqueante).
- El proceso se bloquea durante un intervalo de tiempo. Si transcurrido ese tiempo, el mensaje no ha llegado, el proceso continúa sin el mensaje.
* Casos habituales.
- Envío bloqueante- Recepción bloqueante.
Se usa cuando la sincronización ha de ser muy estricta.
- Envío no bloqueante - recepción bloqueante.
Se usa para cuando el proceso emisor no necesita que el receptor haya recibido el mensaje para continuar. Ej: Servidor de correo.