Semafori

Un semaforo S è una variabile intera

Ad un semaforo si può accedere solo tramite due operazioni atomiche:

wait(S)
{
	while (S <= 0); //non-op
		S--;
}
signal(S)
{
	S++;
}

Realizzazione di mutua esclusione con semafori

Variabili condivise: semaforo mutex; //inizialmente mutex = 1

Processo $P_i$:

do
{
	wait(mutex);
		sezione critica
	signal(mutex);
		sezione non critica
} while (1);

Realizzazione di un semaforo

Sincronizzazione che non necessita di attesa attiva (busy waiting)

Si può definire un semaforo come una struttura:

typedef struct
{
	int valore;
	struct processo *L;
} semaforo;

Assumiamo l’esistenza di due funzioni;

Le operazioni sui semafori sono ora definite da:

void wait(semaforo *S)
{
	S.valore--;
	if (S.valore < 0)
	{
		aggiungi questo processo a S.L;
		block();
	}
}
void signal(semaforo *S)
{
	S.valore++;
	if (S.valore <= 0)
	{
		togli un processo P da S.L;
		wakeup(P);
	}
}

Stallo e attesa indefinita (deadlock and starvation)