Cloud with rain
.:G
G:.
0 and 1 serie, black on white
pulled card
myjsp.feelinglinux.com
ver. 1.1.9-4
Hallo, welcome to my world.
Here you can find some stuff about computer science.
<<< Enjoy your visit! >>>
0 and 1 serie, white on black

Introduzione ai semafori

        Scritto: Giansante Gabriele, 2001     

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.
Un esempio puo' essere l'accesso contemporaneo di due processi ad una stessa zona di memoria:

  1. Il primo processo sta utilizzando i dati contenuti nell'intervallo di memoria XXXXX-YYYYY.
  2. Il secondo processo, contemporaneamente al primo, modifica alcune locazioni di memoria all'interno dell'intervallo precedente.
  3. Il primo processo potrebbe trovarsi in una situazione di inconsistenza dei dati letti in memoria.
Una soluzione al problema puo' essere quella di "sincronizzare" in qualche modo l'esecuzione delle porzioni di codice, nei due processi, che accedono alla memoria.

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.
I semafori possono intervenire nella mutua esclusione delle sezioni critiche.

Vediamo come e' fatto un semaforo. Per il funzionamento si considerano N processi P1,P2, ... , Pn, regolati dallo stesso semaforo.
Un semaforo altro non e' che una variabile intera non negativa che, una volta inizializzata, e' accessibile solo tramite le operazioni "wait" e "signal".
La definizione di "wait", in Java/C, e' la seguente:

while (s>0)
{}
s--;
La definizione di "signal", in Java/C e' la seguente:
s++;
Dalla definizione di "wait" e "signal" risulta chiaro il meccanismo di funzionamento di un semaforo.
Pubblicita'

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.
Utilizzando la programmazione ad oggetti, una risorsa puo' essere vista come istanza della seguente classe:

//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.
Questo problema va affrontato durante la realizzazione del semaforo (comunque l'ordinamento non rientra nella definizione di semaforo) introducendo una politica di scelta dei processi in attesa. Anche in questo caso, pero', bisogna procedere con cautela: una cattiva gestione con un sistema a priorita', ad esempio, potrebbe condannare un processo ad un'attesa infinita.
Un buon metodo di gestione e' la politica FIFO (First In First Out), in cui i processi vengono serviti in ordine di attesa (quello che attende da piu' tempo viene servito prima).


Hai trovato utile questo articolo?
Aiutami a condividerlo o metti un "mi piace".
Grazie mille!


Gli strumenti di condivisione (Google+, Facebook) sono visibili in alto a destra solo dopo aver accettato la policy di utilizzo dei cookie per questo sito.
FAQ - Come faccio a cambiare la mia scelta?

 

Strumenti (myjsp.feelinglinux.com)
Gioco: allenamento con la tastiera Strumenti di codifica/decodifica URI (%-encoding) e Base64 Strumenti di calcolo online per IP e Reti
QUIZ GAME
Quiz game

Cerca @myjsp.feelinglinux.com

Pubblicita'