Comunicazione tra processi
Introduzione
[modifica]Comunicazione 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
[modifica]Lo 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
[modifica]Race Condition
[modifica]Affinché 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