Duda ejercicio 3 examen febrero 2019 Mailbox

Duda ejercicio 3 examen febrero 2019 Mailbox

de Eduardo David Gastelu Leivas -
Número de respuestas: 3

Me quedó una duda con el uso de 
mb_atencion.send(NIL); 
mb_espero_mesa.receive();

Entiendo que la idea es muy usada en ejercicios de Mailbox en general, que con el primer mailbox nos paramos en una fila de espera, y que luego el 2do mailbox sirve para que la Mesa (o generalizando, otro proceso) nos avise que es nuestro turno, en este caso la idea es que la Mesa elige de la gente en espera en orden. Ahora, me queda la duda, si muchos procesos votantes concurrentes ejecutan mb_atencion.send(NIL); y se les quita la CPU antes de llegar a correr mb_espero_mesa.receive();, cuando llegue un proceso N y este si llegue a ejecutar mb_espero_mesa.receive(); ¿no me genera problemas que el que se primero que se bloquee en el recieve no sea el primero en haber hecho un send necesariamente? ¿no va a recibir el mb_espero_mesa.send(); un proceso que no lo merece antes si lo que buscamos es mantener una cola? ¿Se respeta el orden de llegada o hay "colados"? Si se respeta, ¿Cuál es la justificación?

Saludos y gracias


En respuesta a Eduardo David Gastelu Leivas

Re: Duda ejercicio 3 examen febrero 2019 Mailbox

de Jorge Merlino -
El comentario //cola de espera en mb_espero_mesa.receive() apuntaba a eso mismo. La cola de espera está modelada con ese mailbox y se respeta el orden de llegada desde ese punto. Siempre que estás modelando un orden de llegada tenes que definir un punto de inicio a partir de que se toma el orden. Sería el equivalente a "ponerse en la fila". Lo que hagas antes de ponerte en la fila no respeta el orden. Podrías poner otro mailbox antes para mutuoexcluir el send y el receive pero igual es lo mismo porque un proceso pudo haber ejecutado obtener_documento primero pero haber terminado después que otro y también perdería su lugar.
En respuesta a Jorge Merlino

Re: Duda ejercicio 3 examen febrero 2019 Mailbox

de Sergio Ignacio Vico Meyer -
Entiendo con tu comentario Jorge que de esta forma el orden que se puede garantizar en este caso es a partir de este punto (sería luego de ejecutar mb_espero_mesa.receive(); // cola de espera).
Entonces, si varios votantes están trancados en ese receive puedo asumir que siempre serán despertados en el mismo orden en el que se durmieron? Es decir que el orden de espera de 'afuera' del mailbox es siempre FIFO. Esto es así por la propia definición de mailbox o es algo que podemos asumir para cualquier ejercicio de mailbox?
saludos!