Comunicazione a scambio di messaggi

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

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 | modifica wikitesto]

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 | modifica wikitesto]

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 | modifica wikitesto]

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 | modifica wikitesto]

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 | modifica wikitesto]

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 | modifica wikitesto]

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 | modifica wikitesto]
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica