Per poter cooperare tra loro i vari processi devono poter comunicare, la comunicazione deve essere ben strutturata secondo i protocolli IPC (InterProcess Communication). La comunicazione tra processi può andare incontro a problematiche connesse con i problemi delle corse critiche (race condition), ovvero quelle situazioni in cui due o più processi tentano di accedere simultaneamente alla stessa risorsa (ad esempio un’area di memoria comune). Esamineremo questi problemi in un capitolo a parte (Concorrenza e Regione Critica nei Sistemi Operativi).

Esistono tre modalità tramite cui i processi possono comunicare tra loro:

  • Shared Memory;
  • Message Passing;
  • Signal.

Shared Memory

I processi e i thread possono condividere una parte della memoria e utilizzarla per scambiarsi messaggi e informazioni. La sezione di memoria condivisa è detta regione critica. Per evitare di generare una race condition due processi non devono mai trovarsi nella stessa regione critica contemporaneamente. Per evitare che due processi entrino contemporaneamente nella loro regione critica condivisa occorre implementare sistemi di mutua esclusione.

Shared Memory nei Thread

Nativamente i thread dispongono di una memoria condivisa nello spazio degli indirizzi del processo che li contiene. Anche in questo caso occorre implementare sistemi di mutua esclusione.

Message Passing

Questo sistema è implementato prevalentemente dai processi. I dati vengono trasmessi esplicitamente tramite un comando da un processo mittente a un processo destinatario. Questo metodo di comunicazione implementa due primitive, send e receive. Queste primitive non appartengono a un linguaggio di programmazione specifico, ma piuttosto rappresentano delle chiamate di sistema.

Per questo motivo possono essere facilmente implementate all’interno di procedure di libreria:

  • send(destinazione, &messaggio)
  • receive(origine, &messaggio)

I sistemi di scambio dei messaggi vanno incontro a due problematiche principali:

  1. Perdita dei messaggi;
  2. Autenticazione.

Il primo problema si verifica quando il destinatario non riceve il messaggio inviato dal mittente. Per risolvere questo problema si può programmare il ricevente perché invii un segnale di acknowledgment (conferma) alla ricezione del messaggio. Il mittente dovrà a sua volta essere programmato perché rinvii il messaggio se non riceve un segnale di acknowledgment dopo un certo lasso di tempo. Il secondo problema riguarda l’impossibilità di conoscere il mittente della trasmissione. Tuttavia questo problema viene normalmente trattato in ambito crittografico.

Segnali

I segnali sono rappresentati da interrupt software che notificano il verificarsi di un particolare evento. A causa della loro natura sono difficilmente implementabili nei thread.

Ad esempio sono segnali:

  • Le eccezioni dovute a errori di esecuzione;
  • I segnali inviati esplicitamente da un processo all’altro;
  • Eventi asincroni notificati ai processi.

Alla ricezione di un segnale il processo può decidere di:

  • Ignorarlo;
  • Gestirlo;
  • Lasciare il compito al sistema operativo.

Sfortunatamente i segnali non possono portare informazioni.