Un semaforo è una variabile associata a una lista di processi. Esistono due operazioni fondamentali quella di abilitazione e quella di disabilitazione. Tramite i semafori è possibile sincronizzare più processi. In UNIX esistono principalmente due funzioni per la gestione dei semafori: wait e signal. Wait decrementa un contatore e se il contatore è minore di zero blocca il processo in attesa che esso torni di nuovo positivo. La signal incrementa il contatore. Signal e wait lavorano in mutua esclusione. I deadlock si verificano se un processo attende un evento che deve essere provocato da un processo bloccato. Lo starvation è un blocco perpetuo in cui un processo non viene mai rimosso dalla lista in cui è bloccato.
Produttore e consumatore in C
Il problema del produttore e del consumatore può essere realizzato tramite i semafori.
Produttore
INIT (FULL) = 0;
INIT ME_p = 1
while(1)
{
produce (m);
wait(EMPTY);
wait(me_p);
enter(m); // l'inserimento è protetto dagli altri produttori
signal(ME_p);
signal(FULL);
}
Consumatore
INIT (FULL) = MAX;
INIT (me_c) = 1;
while(1)
{
wait(FULL);
wait(me_c);
n=remove(m); // la rimozione avviene ad opera di un solo consumatore
signal(me_c);
signal(EMPTY);
consuma m;
}
Per le immagini Ringraziamo ©claud61
| < Prec. | Succ. > |
|---|






