Torna alla pagina di Sistemi Operativi
:: Appunti caotici ::
Lezione 2 Variabili di lock
...
E' una variabile condivisa tra i processi che interagiscono per accedere in modo condiviso alla risorsa, stabilendone il turno (ovvero a quale processo spetta il diritto di uso in un certo istante).
Nell'utilizzo dei buffer andava tutto bene fin tanto che si leggeva e si scriveva, il problema nasce quando bisogna effettuare degli aggiornamenti. Il problema nello specifico è che se il buffer era pieno il processo si bloccava per depositare il suo messaggio e si impediva l'aggiornamento dell'indice. Ecco perchè devo garantire una sincronizzazione che effettuo con la variabile di turno.
Questo algoritmo scritto in java prevede l'uso di una variabile di turno condivisa.
Commentiamo alcune parti del codice:
public Algorithm 1() { turn = TURN 0; }
public void enteringCriticalSection (int t) { while (turn != t) Thread.yield(); }
public void leavingCriticalSection (int t) { turn = 1 - t; }
Caratteristiche dell'algoritmo:
Anche in questo caso commentiamo alcune porzioni di codice:
private volatile boolean flag0, flag1
Utilizzo due variabili booleane di flag per riferirmi allo stato dei processi
public Algorithm 2() { flag0 = false; flag1 = false; }
public void enteringCriticalSection (int t) { if (t == 0) { flag0 = true; while (flag1 == true) Thread.yield(); } else { flag1 = true; while (flag0 == true) Thread.yield(); } }
public void leavingCriticalSection (int t) { if(t == 0) flag0 = false; else flag1 = false; }
Caratteristiche dell'algoritmo:
Anche in questo caso commentiamo alcune porzioni di codice:
public void enteringCriticalSection (int t) { int other = 1 - t; turn = other; if (t == 0) { flag0 = true; while (flag1 == true && turn == other) Thread.yield(); } else { flag1 = true; while (flag0 == true && turn == other) Thread.yield(); } }
turn = other
, la prossima volta che viene lanciata la funzione passo other
come parametro (l'altro processo) così che se non deve fare nulla ripassa immediatamente il turno all'altro, altrimenti esegue le operazioni che deve fare nel suo turno.
Caratteristiche dell'algoritmo:
La variabile di lock non guarda più lo stato di uso dei processi, quindi il diritto d'uso di un processo, ma lo stato di uso di una risorsa.
Acquisizione della risorsa:
Notare come questi passaggi siano sequenze di operazioni assembler, quindi interrompibili per definizione. Devo perciò garantire che siano loro stesse una porzione critica, disabilitando appunto le interruzione.
Rilascio della risorsa:
Vegono in pratica introdotti nell'hardware del processore dei meccanismi per ottenere la sincronizzazione.
L'istruzione atomica TEST-AND-SET traduce la sequenza di istruzioni precedenti in una sola.
Se però la soluzione vista nella slide precedente è percorribile dal programmatore, questa è perseguibile esclusivamente dal progettista del processore.