La sincronizzazione dei processi
2 processi che comunicano attraverso una area di memoria condivisa:
L’ istruzione di aggiornamento counter++ viene realizzata in linguaggio macchina come da immagine.
Se entrambi tentano di accedere a counter contemporaneamente, le istruzioni in linguaggio macchina possono risultare interfogliate e il risultato dipende da come i processi accedono alla cpu.
Esempio: se counter inizialmente vale 5
Il risultato sarà 4 o 6 a secondo di chi accede per ultimo alla memoria condivisa (mentre il risultato corretto è 5)
Soluzione – progettare un protocollo di cooperazione fra processi:
L’implementazione delle funzioni che regolano l’accesso alla sezione critica può avvenire:
Requisiti da soddisfare:
Attesa limitata. Se un processo ha effettuato la richiesta di ingresso nella sezione critica, è necessario porre un limite al numero di volte che si consente ad altri processi di entrare nelle proprie sezioni critiche, prima che la richiesta del primo processo sia stata accordata:
Processo P0 (analogamente per P1 ): in figura il codice relativo al processo.
Soddisfa la mutua esclusione, ma non il progresso. Se turn=0, P1 non può entrare nella propria sezione critica, anche se P0 si trova fuori della propria sezione critica.
Variabili condivise:
Combina le variabili condivise degli algoritmi 1 e 2
Processo P0 ( analogamente per P1 ): in figura il codice relativo al processo.
Usa il concetto di “processo favorito” per determinare chi deve accedere alla sezione critica (variabile turn)
Sono soddisfatte tutte le condizioni (verificare per esercizio!):
Risolve il problema della sezione critica per due processi.
Supponiamo (per assurdo) che P0 e P1 sono entrambi nella s.c.:
Ma flag[0]=flag[1]=true:
(assurdo perchè è una variabile condivisa)
Variabili condivise:
number [ i ] = 0 indica che Pi è uscito dalla sezione critica.
In un ambiente multiprogrammato per garantire la mutua esclusione basterebbe disabilitare le interruzioni, in modo che i processi non vengano interrotti mentre eseguano la sezione critica
-> Sono annullati tutti i vantaggi del time sharing
Istruzione TestAndSet:
boolean TestAndSet(boolean *target)
Definizione:
L’istruzione è eseguita atomicamente.
Istruzione Swap:
void Swap(boolean &a, boolean &b)
Definizione:
L’istruzione e’ eseguita atomicamente.
Dati condivisi:
boolean lock = false;
Soluzione per n processi:
Processo Pi
I semafori
1. Storia ed evoluzione dei sistemi operativi
2. Struttura dei sistemi operativi
3. Interazione tra hardware e sistemi operativi
4. La rappresentazione dei processi
6. I Thread
7. Lo scheduling dei processi: introduzione e primi esempi
9. La sincronizzazione dei processi
10. I semafori
11. Allocazione contigua dei processi in memoria centrale
12. Allocazione non contigua dei processi in memoria centrale
14. Gli algoritmi di avvicendamento delle pagine
16. I sistemi RAID
17. L'organizzazione logica dei file system
18. L'organizzazione fisica dei file system
1. Storia ed evoluzione dei sistemi operativi
2. Struttura dei sistemi operativi
3. Interazione tra hardware e sistemi operativi
4. La rappresentazione dei processi
6. I Thread
7. Lo scheduling dei processi: introduzione e primi esempi
9. La sincronizzazione dei processi
10. I semafori
11. Allocazione contigua dei processi in memoria centrale
12. Allocazione non contigua dei processi in memoria centrale
16. I sistemi RAID
17. L'organizzazione logica dei file system
18. L'organizzazione fisica dei file system
I podcast del corso sono disponibili anche su iTunesU e tramite Feed RSS.