Comunicazione a scambio di messaggi

In 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 messaggi modifica

Lo scambio di messaggi può essere essenzialmente di tre tipi:

  • comunicazione asincrona: il mittente spedisce il messaggio e continua ad effettuare le proprie operazioni
  • comunicazione sincrona: il mittente spedisce il messaggio ed attende sino a quando il ricevente non ha ricevuto il messaggio, elaborato la risposta ed inviata al mittente
  • remote invocation: il mittente aspetta che il ricevente sia pronto per ricevere, e solo dopo che il ricevente si è dato disponibile per ricevere il mittente invia il messaggio.

Tipologie canali comunicazione modifica

Per 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:

  • il mittente invia il messaggio ad un ricevente specifico individuato tramite il suo id di processo
  • il ricevente accetta messaggi da chiunque
  • il mittente invia il messaggio ad una casella di posta elettronica ed essa a sua volta invia il messaggio al ricevente
  • il mittente invia i dati su un canale di comunicazione ben preciso ed il ricevente sta in attesa di messaggi su quel canale

Primitive di comunicazione modifica

Le 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:

send(identificativo_del_canale, indirizzo_messaggio_da_inviare)
receive(identificativo_del_canale, indirizzo_su_cui_copiare_il_messaggio_ricevuto)

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 receive modifica

Mentre 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:

  • architettura: uniprocessor/multiprocessor
  • forma di comunicazione simmetrica/asimmetrica in ingresso
  • forma di comunicazione sincrona/asincrona
  • canale di comunicazione in guardia/non in guardia
  • ... altre caratteristiche dell'architettura sottostante

Comunicazione asincrona modifica

La 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 sincrona modifica

La 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:

  • I canali vengono stabiliti automaticamente al momento di send/receive
  • Ciascun canale è associato esattamente ad una coppia di processi
  • Tra ogni coppia di processi comunicanti esiste un canale
  • il canale può essere unidirezionale ma di solito è bidirezionale

Voci correlate modifica

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica