I processi in esecuzione nel sistema operativo possono essere indipendenti o cooperanti. Un processo indipendente non può influire su altri processi del sistema, e non può subirne l’ influsso. D’ altra parte un processo è cooperante se influenza o può essere influenzato da altri processi in esecuzione. Ma come fanno due processi a scambiarsi le informazioni necessarie alla cooperazione? Il SO mette a disposizione dei meccanismi di Inter- Process Communication (IPC): opportune system call che permettono a due (o più) processi di scambiarsi dei messaggi o di usare la stessa area di memoria primaria (memoria condivisa). L’IPC fornisce due primitive di base:
send(message,line,process)
receive(message ,line,process)
Se i processi P e Q vogliono comunicare devono quindi inviare e ricevere messaggi tra loro, deve dunque esistere un canale di comunicazione. Ci sono diversi modi per realizzare un canale di comunicazione:
comunicazione diretta: ogni processo che intende comunicare deve dichiarare esplicitamente il ricevente della comunicazione.
Send(P,messaggio), inviai il messaggio al processo P;
receive(Q,messaggio) riceve in messaggio, un messaggio dal processo Q.
Esiste quindi esattamente un canale diretto tra una coppia di processi.
Questo sistema ha quindi una simmetria nell’ indirizzamento, vale a dire che per comunicare il trasmittente e il ricevente devono nominarsi a vicenda.
Una variante di questo sistema si avvale dell’ asimmetria dell’ indirizzamento: soltanto il trasmittente nomina il ricevente.
Send(P,messaggio), inviai il messaggio al processo P;
receive(id,messaggio) riceve in messaggio, un messaggio di qualsiasi processo. In id si riporta il nome del processo con cui è avvenuta la comunicazione.
In entrambe i casi, simmetrico e asimmetrico, la modificazione del nome di un processo può creare dei problemi, in quanto il mittente o il destinatario non trova più il processo nominato nella send o nella receive
comunicazione indiretta: ogni processo che intende comunicare deve inviare dei messaggio a delle zone di memoria dette mailbox, che li ricevono. Le mailbox si possono considerare come un oggetto, identificato in modo unico, nel quale i processi possono introdurre e prelevare messaggi.
Due processi possono comunicare solo se condividono una porta. Le primitive send e receive sono:
Send(A,messaggio), inviai il messaggio alla mailbox A;
receive(A,messaggio) riceve in messaggio, un messaggio dalla mailbox A;
Naturalmente ogni mailbox può essere associata a più di due processi.
Se ci sono due processi che eseguono una receive da A, si tratterà di stabilire una politica per la quale uno dei due riceverà il primo messaggio inviato con una send.
Lo scambio di messaggi può essere sincrono o asincrono, a seconda delle scelte implementative:
send sincrona: il processo che invia il messaggio si blocca fino a che questo non viene ricevuto da qualcuno
send asincrona: il processo invia il messaggio e prosegue la sua attività
receive sincrona: il ricevente si ferma in attesa dell’arrivo di un messaggio
receive asincrona: se all’atto dell’esecuzione della receive non c’è alcun messaggio, il processo prosegue nella sua attività normale
Nel caso della comunicazione asincrona i messaggi vengono accodati in code di priorità che possono essere limitate o illimitate a seconda della lunghezza n della coda.
Tutto quanto riportato in questa pagina è a puro scopo informativo personale. Se non ti trovi in accordo con quanto riportato nella pagina, vuoi fare delle precisazioni, vuoi fare delle aggiunte o hai delle proposte e dei consigli da dare, puoi farlo mandando un email. Ogni indicazione è fondamentale per la continua crescita del sito.