Abbiamo già visto che le unità di esecuzione possono essere eseguite in modo concorrente e, in particolare, anche in parallelo. Prendiamo come esempio i processi:

Ebbene, l’esecuzione concorrente o parallela può contribuire a problematiche che riguardano l’integrità di risorse condivise.

Definizione: risorsa condivisa

Una risorsa condivisa è un insieme di dati condivisi da più unità di esecuzione.

Per tutelare il corretto uso delle risorse condivise, c’è bisogno di una sincronizzazione dei processi.

Definizione: sincronizzazione tra unità di esecuzione

La sincronizzazione tra unità di esecuzione è il meccanismo attraverso cui si attua un coordinamento di diverse unità di esecuzione che presentano dipendenze tra loro a causa di risorse condivise

Una mancata sincronizzazione può portare a diversi problemi: race condition, stalli, attesa indefinita e inversione di priorità.

Esempi classici di problemi di sincronizzazione sono il problema del produttore-consumatore, il problema dei lettori-scrittori e il problema dei filosofi a cena.

Solitamente, in ogni sistema operativo, ci sono alcune unità di esecuzione che contengono al loro interno un segmento di codice, chiamato sezione critica, in cui possono accedere e modificare risorse condivise.

Definizione: sezione critica

Una sezione critica (o regione critica) è un segmento di codice in cui un’unità di esecuzione può accedere a risorse condivise anche da altre unità di esecuzione.

Molte delle soluzioni usate nella sincronizzazione per bloccare l’accesso di un’unità di elaborazione alla sua sezione critica usano il meccanismo del busy waiting.

Definizione: busy waiting

Il busy waiting è un meccanismo usato nella sincronizzazione bloccare l’avanzamento dell’esecuzione di un’unità di esecuzione attraverso una attesa attiva in cui l’unità verifica ripetutamente se ci sono le condizioni per poter procedere.

Problema della sezione critica

L’esecuzione concorrente di più unità di esecuzione all’interno delle rispettive sezioni critiche può portare a problemi che osserveremo più in avanti. Ecco perché la sezione critica deve essere gestita attraverso la valutazione del problema della sezione critica.

Definizione: problema della sezione critica

Il problema della sezione critica consiste nel progettare un protocollo che le unità di esecuzione possano usare per assicurare il corretto accesso a risorse condivise nelle loro sezioni critiche.

Ogni unità di esecuzione, per risolvere il problema della sezione critica, deve svolgere i seguenti passi:

Ogni soluzione del problema della sezione critica, che può essere software o hardware, deve soddisfare i tre requisiti

Esplichiamo i tre requisiti del problema della sezione critica.

Definizione: requisito della mutua esclusione

Il requisito della mutua esclusione nel problema della sezione critica assicura che, se un’unità di esecuzione è in esecuzione nella sua sezione critica, nessun’altra unità può essere in esecuzione nella propria sezione critica, cioè ci deve essere una mutua esclusione sulle risorse condivise.

Definizione: requisito del progresso

Il requisito del progresso nel problema della sezione critica assicura che se nessun’unità di esecuzione è in esecuzione nella sua sezione critica e qualche altra unità desidera entrare nella propria sezione critica allora deve poterlo fare, cioè ci deve essere un progresso nell’avvicendamento delle varie unità nelle loro sezioni critiche.

Definizione: requisito dell'attesa limitata

Il requisito dell’attesa limitata nel problema della sezione critica assicura che se un’unità di esecuzione ha richiesto l’ingresso nella sua sezione critica allora prima o poi l’ingresso sarà effettuato, cioè l’unità non può aspettare all’infinito.

Osservazione: problema della sezione critica come l'andare in bagno

Per capire meglio i tre requisiti del problema della sezione critica, facciamo un’analogia con l’andare in bagno. (Specifico che è un’analogia inventata da me, sollevo il mio professore del corso di Sistemi Operativi o il libro da cui ho studiato da ogni responsabilità.)

Facciamo finta che ci sia solamente un gabinetto a disposizione e io e un mio amico abbiamo entrambi un bisogno URGENTE di usarlo. Per assicurarci che entrambi riusciamo a portare a termine correttamente i nostri bisogni, dobbiamo rispettare i tre requisiti:

Osservazione: soluzione del problema della sezione critica in un sistema mono-elaborazione

Il problema della sezione critica può essere risolto in maniera semplice in un sistema mono-elaborazione impedendo che si verifichino interrupt durante l’accesso a una risorsa condivisa.

In questo modo, saremmo sicuri che l’attuale sequenza di istruzioni sia eseguita in ordine, senza prelazione e, visto che non verranno eseguite altre istruzioni, sarà impossibile apportare modifiche inaspettate alla risorsa condivisa.