Comunicazione a scambio di messaggiIn informatica, la comunicazione a scambio di messaggi (in inglese message passing) è una tipologia di comunicazione tra processi che prevede che non ci siano risorse condivise (e per questo viene anche detta shared nothing, nessuna condivisione), e che tutte le comunicazioni avvengano attraverso l'invio di messaggi tra i processi. Per queste caratteristiche si pone in contrasto con le tecniche di comunicazione che prevedono condivisione della memoria e l'uso dei lock o di meccanismi analoghi per ottenere la mutua esclusione. La comunicazione avviene tramite primitive di comunicazione della tipologia di send (invia) e receive (ricevi). La modalità a scambio di messaggi è molto usata nelle architetture ad alte prestazioni (calcolo parallelo), e il modello più diffuso in questi casi è MPI. Tipologie scambio messaggiLo scambio di messaggi può essere essenzialmente di tre tipi:
Tipologie canali comunicazionePer inviare un messaggio ovviamente il mittente deve esplicitare chi sia il ricevente di esso. Quest'azione di identificare il ricevente viene detta naming, e può avvenire in quattro modi differenti:
Primitive di comunicazioneLe primitive di comunicazione sono solo due: una per l'invio di un messaggio (send), e l'altra per la sua ricezione (receive). Esse agiscono sulla struttura dati canale, che funge da buffer per i messaggi. La specifica di queste due operazioni può dunque essere:
In una visione orientata agli oggetti, si potrebbe dire che l'oggetto descrittore di canale, ha due metodi, send e receive. Compilazione di send e receiveMentre il programmatore ha visione di una sola send e di una sola receive, il compilatore dispone invece di più versioni compilate delle primitive, ciascuna ottimizzata in funzione criteri come:
Comunicazione asincronaLa comunicazione asincrona è quella comunicazione in cui il mittente invia il messaggio e poi continua la propria esecuzione; asincrona sta proprio a significare l'asincronicità che vi è tra l'invio di un messaggio e la risposta al messaggio stesso. Un esempio di comunicazione asincrona può essere il seguente: canale C(int); Processo P1 { int n; ... send C(n); ... } Processo P2 { int m; ... receive C(m); ... } Il processo P1 invia sul canale C il valore della variabile n ed il processo P2 riceve sul canale C il valore della variabile n e la mette nella variabile m. Comunicazione sincronaLa comunicazione sincrona è quella comunicazione in cui il mittente invia il messaggio e rimane in attesa sino a quando il ricevente non invia la risposta al mittente. Un esempio di comunicazione sincrona può essere il seguente: canale C1(int); canale C2(int); Processo P1 { int n; ... synchSend C2(n); receive C1(n); ... } Processo P2 { int m; ... receive C2(m); synchSend C1(m+1); ... } Il processo P1 invia sul canale C2 in modo sincrono il valore della variabile n, il processo P2 sta in attesa sino a quando non riceve il messaggio e quando lo riceve invia sul canale C1 il valore ricevuto incrementato di 1, il processo P1 sta in attesa sino a quando non riceve sul canale C1 un valore, e quando lo riceve entrambi i processi continuano ad eseguire il proprio codice. Proprietà del canale di comunicazione:
Voci correlate |