Comunicazione tra processi
Introduzione
modificaComunicazione tra processi o (IPC)InterProcess Communication - I processi possono comunicare tra loro. Questa comunicazione rappresenta una funzionalità importante che si sviluppa in due aspetti generali:
- Comunicazione: scambio di dati tra processi.
- Sincronizzazione: sincronizzazione di azioni di processi o thread.
Questi due aspetti si realizzano grazie ad alcuni meccanismi (come pipe, FIFO, shared memory, semafori...)
Al tempo stesso la comunicazione deve essere funzionante, efficiente. Essa deve risolvere alcune problematiche: ad esempio può accadere che due processi stanno leggendo o scrivendo un dato condiviso ed il risultato finale dipende dall'ordine di esecuzione dei processi. Queste situazioni rappresentano delle race condition (corse critiche).
Comunicazione
modificaLo scambio di dati con un altro processo avviene per mezzo di più meccanismi di comunicazione che possiamo dividere in due categorie:
- Trasferimento dati: esso avviene attraverso scrittura e lettura. Al fine di comunicare, un processo scrive i dati in un mezzo di IPC e un altro processo legge i dati. Questo è gestito dal kernel, quindi il processo scrivente trasferirà i dati dalla propria memoria utente alla memoria kernel a cui successivamente andrà a fare riferimento il processo lettore.
- Shared Memory - Memoria condivisa: essa permette ai processi di scambiare informazioni mettendole in una regione di memoria condivisa dai processi (in particolare la memoria condivisa non richiede uso di chiamate di sistema o trasferimenti da memoria utente e memoria kernel, per cui risulta un meccanismo di comunicazione veloce).
Lo scambio di dati tramite memoria condivisa è molto sensibile agli errori di programmazione, per cui è solitamente sconsigliato. È sempre possibile pensare a strutture di protezione delle memorie condivise (ad es. i cosiddetti "semafori") che si occupano di garantire la corretta sequenza delle operazioni di scrittura /lettura. D'altro canto l'uso di semafori o strutture analoghe tende a riportare al caso precedente.
Trasferimento Dati
modificaRace Condition
modificaAffinché si possa evitare una "corsa critica" è necessario impedire che più di un processo alla volta legga o scriva contemporaneamente i dati condivisi. Si tende a creare una mutua esclusione, ovvero un modo per assicurarsi che se un processo sta usando una variabile o un file condivisi, gli altri processi saranno impossibilitati a fare la stessa cosa.
All'interno dei programmi si individuano quelle parti (chiamate regioni critiche) in cui un processo richiede una risorsa condivisa, successivamente occorre che:
- due processi non devono trovarsi contemporaneamente all'interno delle proprie sezioni critiche
- si deve rendere il programma indipendente dalla velocità e dal numero delle CPU.
- nessun processo in esecuzione, fuori dalla propria regione critica, può interrompere l'esecuzione di un altro processo.
- nessun processo deve aspettare indefinitamente per poter entrare in una sezione critica.
Tecniche per la mutua esclusione:
- Disabilitazione delle interruzioni