-I semafori non sono meccanismi di intercomunicazione diretta come quelli
-(pipe, fifo e code di messaggi) visti finora, e non consentono di scambiare
-dati fra processi, ma servono piuttosto come meccanismi di sincronizzazione o
-di protezione per le \textsl{sezioni critiche}\index{sezioni critiche} del
-codice (si ricordi quanto detto in \secref{sec:proc_race_cond}).
-
-Un semaforo è uno speciale contatore, mantenuto nel kernel, che permette, a
-seconda del suo valore, di consentire o meno la prosecuzione dell'esecuzione
-del codice. In questo modo l'accesso ad una risorsa condivisa da più processi
-può essere controllato, associando ad essa un semaforo che consente di
-assicurare che non più di un processo alla volta possa usarla.
-
-Il concetto di semaforo è uno dei concetti base nella programmazione ed è
-assolutamente generico, così come del tutto generali sono modalità con cui lo
-si utilizza. Un processo che deve accedere ad una risorsa eseguirà un
-controllo del semaforo: se questo è positivo il suo valore sarà decrementato,
-indicando che si è consumato una unità della risorsa, ed il processo potrà
-proseguire nell'utilizzo di quest'ultima, provvedendo a rilasciarla, una volta
-completate le operazioni volute, reincrementando il semaforo.
-
-Se al momento del controllo il valore del semaforo è nullo, siamo invece in
-una situazione in cui la risorsa non è disponibile, ed il processo si
-bloccherà in stato di \textit{sleep} fin quando chi la sta utilizzando non la
-rilascerà, incrementando il valore del semaforo. Non appena il semaforo torna
-positivo, indicando che la risorsa è disponibile, il processo sarà svegliato,
-e si potrà operare come nel caso precedente (decremento del semaforo, accesso
-alla risorsa, incremento del semaforo).
-
-Per poter implementare questo tipo di logica le operazioni di controllo e
-decremento del contatore associato al semaforo devono essere atomiche,
-pertanto una realizzazione di un oggetto di questo tipo è necessariamente
-demandata al kernel. La forma più semplice di semaforo è quella del
-\textsl{semaforo binaria}, o \textit{mutex}, in cui un valore diverso da zero
-(normalmente 1) indica la libertà di accesso, e un valore nullo l'occupazione
-della risorsa; in generale però si possono usare semafori con valori interi,
-utilizzando il valore del contatore come indicatore del ``numero di risorse''
-ancora disponibili.
-
-Purtroppo l'implementazione effettuata nel sistema di intercomunicazione di
-System V complica inutilmente questo schema elementare: anzittutto non è
-possibile definire un singolo semaforo, ma se ne deve creare per forza un
-insieme, specificando il numero di semafori che esso deve contenere con
-l'argomento \param{nsem} di \func{semget}.
-
-Ma i difetti maggiori dei semafori nel System V IPC sono due: il primo è che
-non esiste una funzione che permetta di creare ed inizializzare un semaforo in
-un'unica operazione atomica; occorre prima creare l'insieme con \func{semget}
-e poi inizializzarlo con \func{semctl}.
-
-Il secondo è che essendo i semafori delle risorse globali di sistema, che non
-vengono cancellate quando nessuno le usa più, ci si trova a dover affrontare
-esplicitamente il caso in cui un processo termina per un qualche errore,
-lasciando un semaforo occupato, che resterà tale per sempre, a meno di non
-rimediare la situazione con opportune operazioni di ripristino.
-
-Come accennato una volta creato l'insieme di semafori per l'inizializzazione
-dei valori occorre ricorrere ad una funzione separata, \func{semctl}, che è
-quella che effettua le operazioni di controllo; il suo prototipo è: