Il problema

Abbiamo visto che le azioni atomiche sono un tutto o nulla, ma se abbiamo delle sequenze di istruzioni non atomiche bisogna trovare un modo per garantire la non interferenza.

L’idea è di trovare un modo per segnalare che certe parti del programma sono “speciali”, ovvero devono essere eseguite in modo atomico, senza alcuna interruzione. Queste parti le chiameremo sezioni critiche.

<aside> 💡 Def.: La parte di un programma che utilizza una o più risorse condivise viene detta sezione critica (critical section o, per brevità, CS).

</aside>

Esempio:

process P1 {
	a1 = read();
	totale = totale + a1; // sezione critica
}
process P2 {
	a2 = read();
	totale = totale + a2; // sezione critica
}

Le due parti segnalate sono sezioni critiche perché accedono alla risorsa condivisa totale.

Obiettivi

La soluzione al problema emerso deve garantire che le sezioni critiche vengano eseguite in modo mutualmente esclusivo e allo stesso tempo evitare deadlock e starvation. Infine vogliamo evitare attese non necessarie, un processo può far attendere gli altri solo se questi devono usare una sezione critica attualmente occupata dal primo.

Sintassi

Nel seguito del corso useremo la seguente sintassi negli esempi:

[entes cs] // indica il punto di inizio di una sezione critica
...
[exit cs] // indica il punto di fine

// esempio
x = 0;
Process P {
	[enter cs];
	x = x + 1;
	[exit cs];
}

Le sezioni critiche

Abbiamo visto che il problema fondamentale è indicare al S.O. quali sono le sezioni critiche che vanno quindi eseguite in modo atomico, dal momento che il S.O. da solo non è in grado di riconoscerle.

Nel definire le sezioni critiche dei processi bisogna fare attenzione a rispettare i requisiti elencati prima: mutua esclusione, assenza di deadlock, assenza di attese non necessarie, assenza di starvation.

Occorre fare un’assunzione prima di continuare a trattare le CS:

<aside> 💡 Se un processo entra in una sezione critica, prima o poi ne uscirà.

</aside>

Ovvero un processo può terminare solo fuori dalla sua sezione critica.

Possibili approcci

Si possono implementare le sezioni critiche essenzialmente in due modi: