ora abbiamo alcune primitive per passarci i messaggi, vogliamo creare metodo in modo che i processi si possano sincronizzare mandando messaggi.
la memoria è sempre privata.
Primitive
Send e receive 🟩
Send
- Spedizione del messaggio
- input deve avere un identificato al processo su cui spedire.
Se si vuole espandere si possono avere multicast e broadcasting ma non li studieremo in questo corso.
Receive
Ricevi messaggi
Tassonomia dei message passing (!)🟩
-
Slide
Sincrono
In questo caso entrambi send e receive sono bloccanti, quindi non possono andare avanti finché non è mandato e finché non è ricevuto!
Asincrono
Simile al precedente, solo che il send non aspetta che il ricevente prenda il messaggio!
NOTA: non si aspetta che il receiver riceva il messaggio!
Completamente asincrono
nessuno di due aspetta, il receive se nessuno ha inviato non riceve niente!
Thoth
proponeva 3, reply receive send, principalmente solo la reply è bloccante.
più o meno tutti gli autori avevano una sintassi diversa per il message passing
Equivalenza fra sincrono asincrono
Si può vedere che questi due metodi si possono rivelare equivalenti
Sincrono dato quello asincrono 🟩
-
Slide
Per bloccare il asendodevo fare un areceive per un ack, così lo blocco
NOTA: ed è esattamente questo, un ack aggiuntivo che hai fatto all’esame che ti ha fatto perdere tipo 2 punti, stai attento!
Asincrono dato quello sincrono 🟩-
-
Slide
Si vede che il sincrono non è espressivo tanto l’asincrono perché abbiamo bisogno di far uso di un altro processo server.
Problemi classici 🟨
Filosofi a cena
-
Slide
Basta ricordarsi di fare anche il filosofo mancino e poi siamo apposto! Sarebbe poi la stessa soluzione proposta in Semafori
Producer consumer
-
Slide