Torna alla pagina di Sistemi Operativi
:: Appunti caotici ::
Lezione 4 Comunicazione con scambio di 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.
Il contenuto dei messaggi può contenere diverse informazioni che sono:
Il sistema operativo può assegnare buffer:
La quantità di buffer assegnati dal sistema operativo può essere:
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.
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.
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.
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.
Come sempre ci devono essere delle politiche di sincronizzazione per evitare dati inconsistenti. Ci possono essere due tipi di comunicazioni:
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:
I problemi che sorgono sono immediati:
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)