|
||
| [IT] Introduzione ai semafori | ||
|
Introduzione ai semafori Senza i semafori per le strade, si potrebbe essere tentati di "smontare" la legge dell'impenetrabilita' dei corpi. In un sistema informatico ove piu' processi possono
essere eseguiti contemporaneamente ed eventualmente condividere le risorse
a disposizione, si pone il problema dell'accesso contemporaneo ad una o
piu' di tali risorse (siano esse zone di memoria che dispositivi diversi
come ad es. i dischi). Cioe' si pone un problema di sincronizzazione e
di comunicazione fra processi.
Una "sezione critica"
e' una porzione di codice, in un processo, in cui possono essere modificate
variabili comuni a piu' processi, file, tabelle, ecc., che non puo' essere
eseguita contemporaneamente ad altre sezioni critiche. In pratica, l'esecuzione
di sezioni critiche e' mutuamente esclusiva.
Vediamo come e' fatto un semaforo. Per il funzionamento
si considerano N processi P1,P2, ... , Pn, regolati dallo stesso semaforo.
La definizione di "signal", in Java/C e' la seguente:
Dalla definizione di "wait" e "signal" risulta chiaro il meccanismo di funzionamento di un semaforo.s++; Il valore "s" viene inizialmente posto pari al numero di processi che potranno interagire contemporaneamente. Quindi, il valore di un semaforo, inizialmente, sara' sempre maggiore di zero. Se la variabile s assume il valore zero, allora tutti i processi che vogliono interagire con un'altro (sempre regolato dallo stesso semaforo), devono aspettare che si "liberi un posto". Una volta inizializzato, il semaforo potra regolare l'interazione con le operazioni "wait" e "signal". Con l'operazione "wait", un processo "impegna" una possibilita' di interazione (una risorsa, nel caso si stia regolando l'accesso ad un certo numero n di risorse), ammesso che ce ne sia la possibilita'. Infatti, con il ciclo while si aspetta, eventualmente, che la variabile s torni ad essere positiva, cioe' che uno o piu' processi rinuncino al diritto di interazione. Dopo aver aspettato, e' necessario assicurarsi di mantenere il diritto ad interagire appena acquisito. Lo si fa decrementando la variabile s e quindi le possibilita' rimaste. Quando il processo non ha piu' bisogno di interagire con gli altri, allora utilizza la "signal" per incrementare s e quindi permettere ad un altro processo, che ne faccia richiesta, di entrare in gioco. Si parla di semaforo binario quando la variabile s puo' assumere solo i valori 0 e 1. Invece, si parla di semaforo generale quando la variabile s puo' assumere valori qualunque. E' stato parlato in precedenza della mutua esclusione
delle sezioni critiche. Vediamo allora come implementare questa mutua escluzione
con i semafori binari.
//Pseudo-Java
class risorsa
{
//Strutture e variabili proprie della risorsa
...
//Semaforo binario (inizializzazione ad 1)
Semaforo Sem=new Sem(1);
//Operazioni di accesso alla risorsa
void Op1(...)
{
//Aspetto che nessun processo stia accedendo alla risorsa.
wait(Sem);
//Sezione critica
...
//Rilascio il diritto ad accedere alla risorsa
signal(Sem);
}
void Op2(...)
{
//Aspetto che nessun processo stia accedendo alla risorsa.
wait(Sem);
//Sezione critica
...
//Rilascio il diritto ad accedere alla risorsa
signal(Sem);
}
...
}
Si puo' notare, in quest'esempio, come ogni operazione di accesso alla risorsa condivisa, aspetti che non ci sia alcun processo con accesso alla risorsa. Una caratteristica della gestione con i semafori
e' la mancanza di ordinamento tra i processi in attesa. Una conseguenza
riguarda il fatto che e' possibile che un processo non riesca mai ad utilizzare
la risorsa bloccata, rimanendo sconfitto nel concorrere all'assegnamento
della stessa, una volta che viene liberata.
|
||
(c) 1999-2006
|