Torna alla pagina di Sistemi Operativi
:: Appunti caotici ::
Lezione 4
Comunicazione con scambio di messaggi
Pag 2
Modello della comunicazione a messaggi
In questa tecnica il processo mittente genererà le informazioni da trasmettere e le invierà, mediante messaggi, al processo ricevente. La politica utilizzata sarà la FCFS.
Messaggi
Il contenuto dei messaggi può contenere diverse informazioni che sono:
- Identità del processo mittente;
- Identità del processo ricevente;
- Informazioni da trasmettere;
- Eventuali informazioni relative alla gestione dello scambio di messaggi.
Pag 3
Buffer
Il sistema operativo può assegnare buffer:
- ad ogni coppia di processi, in modo esplicito;
- di uso generale, ovvero un unico pool di buffer che il sistema operativo mette indistintamente a disposizione per i vari processi. C'è però da considerare il fatto che questa scelta potrebbe risultare rischiosa, nel caso in cui avessi più applicazioni aperte.
La quantità di buffer assegnati dal sistema operativo può essere:
- Illimitata: il processo mittente appena possiede un messaggio lo deposita immediatamente nel buffer. Non è mai bloccante;
- Limitata: il processo mittente potrebbe aspettare prima di depositare il messaggio nel caso in cui non ci siano buffer liberi. Risulta quindi bloccante se manca spazio disponibile;
- Nulla: il processo mittente non può depositare alcun messaggio, dato che non ci sono buffer disponibili in cui deporlo. E' sempre bloccante. Da notare come il processo ricevente non trovi alcun messaggio da leggere, ma il processo mittente in attesa di deporlo; ciò potrebbe permettere l'instaurarsi di una comunicazione diretta
Funzioni (1)
Per permettere l'invio e la ricezioni di messaggi sono state messe a disposizioni determinate funzioni:
Invio: send(proc_ricevente, messaggio).
Deposita il messaggio in un buffer libero. La funzione è bloccante, ovvero blocca il processo mittente nel caso in cui non ci fossero buffer liberi. Una volta liberato un buffer il processo mittente potrà depositare il messaggio e la funzione sbloccherà il mittente.
Con questa funzione il processo mittente manda il messaggio e non se ne preoccupa più: se non c'è spazio nel buffer aspetta tutto il tempo che gli serve.
Pag 4
Funzioni(2)
Ricezione: receive(proc_mittente, messaggio).
Riceve il messaggio presente nel buffer. Tale funzione è bloccante, ovvero blocca il ricevente fino a quando non c'è un messaggio nel buffer.
Funzioni (3)
Nel caso non si voglia una chiamata bloccante si effettuano delle chiamate di invio e ricezione condizionale.
Invio condizionale: cond_send(proc_ricevente, messaggio): error status.
A differenza della funzione di invio precedente questa funzione non è bloccante, ovvero se al momento di depositare il messaggio non è presente alcun buffer libero ritornerà un messaggio di errore e il messaggio non sarà più depositato, ma sarà responsabilità del mittente decidere se rimandarlo o meno.
Pag 5
Funzioni (4)
Quindi si avrà anche una
Ricezione condizionale: con_receive(proc_mittente, messaggio): error status.
Allo stesso modo il processo ricevente preleverà il messaggio dal buffer, se non ci sono messaggi ritornerà una condizione di errore, non ricevendo alcun messaggio.
Sincronizzazione dei processi comunicanti
Come sempre ci devono essere delle politiche di sincronizzazione per evitare dati inconsistenti. Ci possono essere due tipi di comunicazioni:
- Comunicazioni asincrone: queste chiamate sono bloccanti solo se l'operazione non può essere completata, l'invio avviene indipendentemente da ciò che sta facendo il processo ricevente. In altre parole, quando P manda il messaggio non sa a che punto della computazione sia arrivato Q, dato che può mandarlo in qualsiasi momento;
- Comunicazioni sincrone: queste comunicazioni sono possibili quando tutti e due i processi sono pronti per lo scambio di informazioni (quindi il processo mittende spedirà le informazioni e il processo ricevente sarà subito pronto per prelevarle). Nel caso in cui il processo mittente arrivi per primo si dovrà fermare ed aspettare il processo ricevente.
Pag 6
Identificazione dei processi comunicanti
Utilizzando la tecnica dello scambio di messaggi per la comunicazione dei processi devo identificare i processi che vogliono comunicare. Posso avere due tipi di comunicazione:
- Comunicazione simmetrica: è il caso in cui dico esplicitamente chi è il processo mittente e chi è il processo ricevente (comunicazione diretta);
- Comunicazione asimmetrica: in questo caso il processo mittente o il processo ricevente possono non essere identificati univocamente. Posso quindi ricevere messaggi da un processo di un gruppo specificato oppure da un gruppo qualsiasi. Allo stesso modo posso inviare messaggi a un processo di un gruppo specificato oppure a un processo qualsiasi.
Caratteristiche e problemi
I problemi che sorgono sono immediati:
- Come faccio ad indentificare i processi che vogliono comunicare?
- Non vi è alcuna memoria condivisa fra i processi;
- Le operazioni di sincronizzazione degli accessi è gestita implicitamente dal sistema operativo.
Pag 7
Implementazione
Per risolvere i problemi elencati precendentemente posso implementare i buffer direttamente nello spazio di indirizzamento del sistema operativo, definendo il numero dei buffer che voglio utilizzare. Utilizzando quest'implementazione risolvo anche il problema dell'identificazione dei processi che inviano informazione, dato che mi basta vedere qual è il processo attivo, in quanto colui che ha fatto richiesta si troverà sicuramente nello stato di running.
I messaggi vengono normalmente smaltiti in modalità FIFO, ma potrebbero essere previste politiche di altro tipo (ad esempio con priorità, fissando deadline, ecc)
Torna alla pagina di Sistemi Operativi