Meccanismi di Sincronizzazione: Semafori, Wait, Signal e il Problema dei Filosofi Commensali

Classificato in Informatica

Scritto il in italiano con una dimensione di 3,59 KB

Semaforo: Strumento di Sincronizzazione

Il semaforo è uno strumento di sincronizzazione fondamentale per risolvere i problemi delle sezioni critiche e i problemi di concorrenza. Si tratta di una variabile intera a cui è possibile accedere solo attraverso due operazioni atomiche: Wait e Signal.

Quando un processo modifica il valore di un semaforo, gli altri processi non possono farlo contemporaneamente. Viene inizializzato con un valore non negativo. L'operazione Wait (o P) diminuisce il valore del semaforo. Se il valore risultante è negativo, il processo viene bloccato. L'operazione Signal (o V) aumenta il valore del semaforo. Se il valore risultante è positivo, un processo bloccato dall'operazione Wait viene sbloccato.

La definizione formale è:

P(s) (while (s <= 0)
 s--);
V(s) (s++);

I sistemi operativi utilizzano i semafori per controllare l'accesso a una sezione critica o la condivisione di risorse. Il semaforo viene inizializzato a un valore che corrisponde al numero di risorse disponibili. Ogni processo che desidera utilizzare una risorsa esegue un'operazione Wait sul semaforo. Quando rilascia la risorsa, esegue l'operazione Signal. Quando il contatore è 0, tutte le risorse sono in uso e i processi che desiderano utilizzarle vengono bloccati fino a quando il contatore non torna a essere maggiore di 0.

Implementazione dei Semafori

Uno dei problemi più comuni è che quando una risorsa non è disponibile, il processo esegue un ciclo continuo (*spin lock*). Questo fenomeno è chiamato attesa attiva (busy waiting) e spreca cicli di CPU.

Per evitare questo problema, si utilizza il metodo di blocco, il che significa che quando la risorsa non è disponibile, il processo viene sospeso e inserito in una coda associata al semaforo. Il processo passa quindi allo stato di attesa. Successivamente, il controllo viene restituito allo scheduler della CPU, che seleziona un altro processo per l'esecuzione.

Un processo bloccato in attesa del semaforo viene riavviato quando un altro processo esegue un'operazione Signal. Il riavvio avviene tramite un'operazione Wakeup, che cambia lo stato del processo da "in attesa" a "pronto". Questo processo viene quindi inserito nella coda dei processi pronti.

Il Problema dei Filosofi Commensali

Si considerino cinque filosofi che trascorrono la vita a pensare e mangiare. Essi condividono un tavolo rotondo comune con cinque sedie, una per ogni filosofo. Al centro del tavolo c'è una ciotola di riso e solo 5 bacchette (bastoncini) per mangiare.

  • Quando un filosofo pensa, non interagisce con i suoi colleghi.
  • Quando un filosofo ha fame, cerca di prendere le due bacchette più vicine.
  • È possibile prendere solo una bacchetta alla volta.
  • Non si può prendere una bacchetta che è già nelle mani di un altro filosofo.

Una volta che ha finito di mangiare, rilascia le bacchette e ricomincia a pensare. Questo è un classico problema di sincronizzazione ed è un esempio di una vasta classe di problemi di controllo della concorrenza. Si tratta di una semplice rappresentazione della necessità di assegnare risorse multiple tra processi concorrenti.

Soluzione tramite Semafori

Come soluzione, ogni bacchetta può essere rappresentata da un semaforo binario. Un filosofo cerca di prendere una bacchetta eseguendo l'operazione Wait sul semaforo corrispondente e la rilascia eseguendo l'operazione Signal.

Voci correlate: