Comunicazione tra processi

Da Wikiversità, l'apprendimento libero.
Jump to navigation Jump to search
lezione
Comunicazione tra processi
Tipo di risorsa Tipo: lezione
Materia di appartenenza Materia: Sistemi operativi

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