(1) Sistemi Operativi Prof. P. Cattaneo ufficio: L Ricevimento: Martedì14.00 – Mercoledì18.00 –19.00
(2) Sincronizzazione tra processi Proprietà Mutua Esclusione: In ogni istante al più un processo avrà accesso ad una regione critica => Se un processo Pi è nella sua regione critica nessun altro processo potrà accedervi Progresso: Se nessun processo è nella regione critica ed uno o più processi richiedono laccesso, solo processi che non sono in regione critica parteciperanno (eseguiranno il codice) alla decisione su quale sarà il prossimo processo ad accedervi Attesa limitata: Ogni processo dopo aver richiesto laccesso ad una regione critica attenderà un tempo finito durante il quale altri processi potranno accedere una o più volte alla regione critica ma necessariamente in numero finito
(3) Algoritmo n.1 enum procs { pi, pj} Turno; repeat while (Turno != pi) do_no_op; sezione critica Turno = pj; until false;
(4) Algoritmo n.2 bool flag[2]; repeat flag[i] = true; while (flag[j] == true) do_no_op; sezione critica flag[i] = false; until false;
(5) Algoritmo n.3 bool flag[2]; enum procs { pi, pj} Turno; repeat flag[i] = true; Turno = pj; while (flag[j] and Turno == pj) do_no_op; sezione critica flag[i] = false; until false;
(6) Algoritmo per n processi repeat choosing[i] = true; number[i] = max(number) + 1; choosing[i] = false; for(j = 0; j < n; j++) { while (choosing[j]) do no-op; while((number[j] != 0) and (number[j]+j < number[i]+i)) } sezione critica number[i] = 0; until false;
(7) Supporto HW: TestAndSet int TestAndSet( int * target) { int tmp = *target; *target = true; return tmp; }
(8) Mutua esclusione con TestAndSet repeat while (TestAndSet( &lock)) do_no_op; sezione critica lock = false; until false;
(9) Supporto HW: Swap void Swap( int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; }
(10) Mutua esclusione con Swap repeat Key = true; do { Swap( &lock, &key); } while (Key != false); sezione critica lock = false; until false;
(11) Implementazione di wait(S) struct semaphore { int valore; List L; } void wait(struct semaphore S) { S.valore--; // N.B. sincronizzazione !!! if S.valore < 0) { L.append(MyPID); // metti il processo nella coda // dei processi waiting }
(12) Implementazione di signal(S) struct semaphore { int valore; List L; } void signal(struct semaphore S) { S.valore++; // N.B. sincronizzazione !!! if S.valore < 0) { PID = L.head(); // wakeup il processo PID // dalla coda dei processi waiting }
(13) Sincronizzazione tra processi Uso dei semafori repeat wait(mutex); // sezione critica signal(mutex); // sezione non critica until false;
(14) Implementazione di region x when B do S wait(mutex); while (!B){ first_cnt++; if (second_cnt > 0) signal(second_delay); else signal(mutex); wait(first_delay); first_cnt--; second_cnt++; if (first_cnt > 0) signal(first_delay); else signal(second_delay); wait(second_delay); second_cnt--; } Regioni critiche (1)
(15) Regioni critiche (2) Implementazione di region x when B do S … S; // esecuzione regione critica if (first_cnt > 0) signal(first_delay); else { if (second_cnt > 0) signal(second_delay); else signal(mutex); }