LEZIONE 3
SINCRONIZZAZIONE
TRA PROCESSI: SEMAFORI
IN QUESTA LEZIONE IMPAREREMO...
|a definire e utilizzare i semafori di basso livello e spin lock()
il concetto di indivisibilita di una primitiva
il funzionamento dei semafori di Dijkstra
B Premessa: quando é necessario sincronizzare?
‘Nel caso di process! interagent, siano essi in competizione, cis che chiedono uso di una risorsa
comune riusabile e di molteplicit2 finita per i propri scopi, oppure siano in cooperazione per rai
‘glungere un obiettivo comune, possono verificarsi casi di interferenza,
Lastrategia da adottare per gestire linterierenza & diversa per ogni situazione e dipende dalla tolle-
che il sistema pud permettersi degli effetti di una errata sincronizzazione, dalla possibilita
di individuare agevolmente le eventuali situazioni e di poterle correggere ripristinando le situarioni
precedent ed evencualmente ripetendo le operazion! eritiche.
Possiamo classificare in quattro gruppi la casistica di situazioni possibili e per ogni gruppo indicare
Varione che # nevessario effettuare:
ST Esempio Strategie
inaccetiabl incrocio stredale ‘evitere ogn! imerferenca
vaseurabil appleasioni non evtiche ignores
Flavabill s cantrellabl iterator ‘llevara ad avira
‘levablli a racuperabili rate ethernet rilevare @ ripetere
Nei ci occuperemo del primo caso, cio® di si
‘tuaztont in cut la competizione tra | processt cl
porta a situaziont di interferenza che possone
Provocare sitazioni inaccettabili e che quind
devono essere gestite con la mutua esclusione.La sezione critica viene gestita in modo che:
© um processo che deve accedere a una regione critica deve chievere l'autorizzazione eseguendo
tuna serie di istruzioni che, nel caso la risorsa fosse libera, gli garantiscono il suo utilizz0 esclusi-
vo per tutta la durata della sua elaborazione; se la risorsa fosse oveupata il gestore ne impedisoe
accesso gestendo la richiesta, per esempio, con una coda di attesa;
© quando un processo termina df utilizzare una risorsa, ha quind! terminato Tesecuzione delle
istruzioni della sezione critica, deve effettuare un insieme di operazioni per rilasciarle in modo
che possa essere utilizzata dagli altri processi
‘Mediante Futilizzo di primitive che regolino accesso e ilrilascio della risorsa ® necessario garantire che:
© [a risorsa o 2 libera oppure @ utilizzata da un solo proceso (eendizione di mutaa exclusions
© i provessi deveno sompre poter accedere alla risorsa richiesta e portare a termine il proprio
voro (coniizione dl feirness)
@ i process non devono avere ciel di ritardo non necessari che possano rallentare accesso alla
regione critica de parte di un altro proceso.
B Semafori di basso livello ¢ spin lock()
_Affronteremo Ia trattazione del caso di richiesta di risorsa singola da parte di soli due processi ma il
concetto @ immediatamente estendibile a un numero qualsivogiia di processi: pit complesso é inve-
ce il caso di risorse multiple richieste contemporaneamente dagli stessi processi, che discuteremo,
nella prossima lezione.
Il primo meceanisma che analizsiamo 2 quello che associa a ogni risorsa una var
al suo valore assume il seguente significato:
x che in base
x= 1 risorsa litera, cio? nessun processo la sta utilizzando;
x0 risorsa ocoupata da un processo.
(Quin il fag fala funatone di un semaforo
x= 1 semaforo verde, 2 possibile aucedere alla isorsa;
x= 0 semaforo rosso, la risorsa e cccupata ed 2 necessario met-
tersi in attesa che siliberi.
‘Vediamo come esprimere in pseudocodifica i segmenti di codice per elfettuare rispettivamente lal-
locazione e il rilascio di una risorsa,
Allocazione di una risorsa: lock()
La primitiva (o funzione) che permeite di allocare una risorsa prende il nome di lock()
Possiamo indicare la sua sintassi nel seguente formato:
eet) +
dove x 2 Il semaforo assoclato alla risorsa che desideriamo uullizzare,La primitiva lock) deve:
» testare il semaforo per verificarne il suo colore;
» se 2 verde, modificane il valore a rosso;
» se @ rosso, aspettare che diventi verde per poi metterlo a rosso.
In pseudocodifioa una possibile realizzazione @ la seguente:
funaione lock (x)
ripeti // cielo di attesa sul senaforo rel caso che sia rosso
tnche x= // esci dal cicio 2 senatoro verce
x- 0 // matt: i1 senaforo @ rosso
fne
jo di una risorsa: unlock()
La primitiva (o funzione) che permette di rilasciare una risorsa prende il nome di unlock()..
Possiamo indicare la sua sintassi nel seguente formato:
umiock(x)2
dove x & tl semaforo assoctaco alla rlsorsa che destderiamo utilizzare.
La primitiva unlock() deve semplicemente modificare il valore del semaforo da rosso a verde, quindi:
funzione unlock(x)
ae {/ matt: 1 senaforo a verde
ine
La mutua esclusione si ottiene facendo precedere la lock(x) « une sezione critica e facendala seguire
da una unlock().
Tock(x);
< sezione critica>
unlock (x) 1
Problema della indi Lith
Per come abbiamo scritto listruzione di lock() non possiamo garantire l'acceso seriale a una risorsa,
{in quanto potrebbe verificarsi una situazione di interleaving indesiderata.‘Veullamo per esempto la seguente situaztone:
Hi ipotizziamo che il semaforo sia verde x = 1
Bi Il processo P1 effettua la lock(x) fino a verificare la condizione di test ma viene sospeso prima
‘che ne possa modificare il valore:
FL un secondo processo P2 effettua anch'esso a lock(x) e, trovando il semaforo verde, lo mette a
rosso ¢ inizta a utiizeare la risorsa;
quando viene risvegliato il processo Pl esegue Vistruzione che pone a rosse il semaforo (che ei
fatto perd @ gid 10ss0) e anch’esso utiliza la risorsa.
Per evitare questa situazione® necessario rendere indivisibile Tesecuzione delle istruzioni della fun-
Fione lock(): a soluzione potrebbe essere quella di disabilitare le interruzioni allinizio eal termine
Ui questa funzione In modo che divend Inincerrompibile.
Per esempio il codive potrebhe essere il seguente:
funzione loekix)
cipeti // ciclo di attesa sul semaforo nel caso che sia rosso
dnene x82 // esci dai ciclo 2 semaroro verae
x<-0; // natti il senaforo a rosso
fine
|Analoge problema potrebbe verificarsi per interleaving anche sulla primitive di unlocks) # quindi
anch'essa viene eseguite a interruzioni disabilitate.
funzione anleok(x)
Sdisabilitare le interruzioni>
x<-1; // natti il senaforo a verde
Riscriviamo le due primitive utlizzando queste due nuove istruziont:
fanziona leck(x)Fipeti // cicie di attesa sul senaforo ael caso che sia rosso
Hnche Testaadset(x) // esci al ciclo settando i1 senaforo a rosso
fine
Euazione unlock (x)
sex); // matti il semaforo 2 verde
fine
Nonostante quesio miglioramento rimane da riselvere Il problema della attesa attiva; inoltre non
‘abbiamo la garanzia esplicita che un processo non attenda indefinitamente su di un semaforo che,
anche se diviene verde, viene petutamente assegnaco ad alu processi ¢ non a lui,
| primi notare la necessit di avere una istruzione indivisible furono i progettist dell'0S/360
che aggiunsero nel linguaggio macchina del sistema 'struzione TEST AND SET LOCK (751).
@ Semafori di Dijkstra
EW. Dijaginnel 1966 lm prc spite che penincticns bi waht a gublata proba
sone
ee
interazione fra provessi
> a primitiva P(S), che rieeve
utilizzata per accedere alla risorsax,
» la primitiva V\S), che riceve anch'essa in ingresso un numero intero S non negative (semaforo)
cche viene utllizzata per rilaselare la risorsa
Intoduelamo quindi un nuevo po di daw, il semaphore, dove una sua Istanza noa 2 altro che una
varlabille intera non negativa alla quale & possibile accedere solo cramite le due primidve P(S) e VS).
SESE Il primo semaforo
Dichiarazione di un oggetto di tipo semaphore:
senaphore 8 = vii
dove vi (viz) 8 il ealore inisiale e il valore 0 corrisponde al rosso.Lidea di Dijkstra @ quella di disciplinare 'accesso alle risorse mediante code e rendendbo insttive le
sltuazion| di attess: se un semaforo rosso il processo che fa Il test (richlama la primluva P(S)) st
sospende e viene messo nella coda dei processi, in attesa che si liberi quella risorsa mentre
cesso che rilascia la risorsa invoca la primitiva VS) che modifica il valore del semaforo Se risvedlia
{primo processo presente nella coda di atresa,
Lee TUT
ORIGINE DIP EV
‘Ofiginariamente queste primitive avevano il nome di wait e signal: Dijkstra lf sosttul con le in-
Ziali Pe V di due termini olandet
Ve Hliniiale cal termine olandese verhogen: aumentare, alzare di livello:
» P Viniziale dal termine olandese proberen: provare, testare.
Un proceso che esegue una P(S) pud avanzare solo se trova S > 0, altrimenti deve accodarsi per
attendere passivamente una (8); un proceso che esegue una V(S). se non esistono processi in
attesa dentro la coda, ha come unico effetto quello di inerementare S, altrimenti risveglia uno det
rocessi che attendono nella coda: successivamente, in entrambe le situazioni, continua la propria
iprocessore si realizzeno introducendo spinlock e/o disabilitando/riabilitando gli
joffine di ciascuna di esse (dato che sono implementate direttamente dal sistema
tervallo temporale in cui gli interrupt sono disabilitati @ molto breve)
interrupt all’
operativo e I@ Semafori binari vs semafori di Dijkstra
| semafori di Dijkstra vengono anche chiamati semafori generalizzati (o a conteggio) per distingver-
Ji dai semafori binari
In letteratura si trovano spesso i nomi down(S) ¢ up(S) per indicare rispettivamente P(S) ¢ V(S) dae
to che listruzione 2($) decrementa di 1 il valore del semaforo (down(S)) e Fistruzione V(S) invece
1a incrementa (up(S)).
Molteplicita di una risorsa
Isemafori « contegsio vengone utilizzati per controllare lacoesso 2 una risorsa disponibile in un
numero finito di esemplari: noi vedremo nel seguito una applicazione nel caso di utilizzo di un array
‘di NUM celle come risorsa condivisa, clascuna di esse destinata a contenere una variabile da condi=
videre e quind! ll semaforo verra Intzializzato al valore NUM per indivare che sono dispoatbili NUM
risorse e quinu il semaforo rimane verde finché non sono state tutte “occupate”
Al test sul semaforo § possiamo avere due situazior
§ =X dove xc=NUM@ il numero di esemplari di risorsa liberi: se X > 0 il proceso pud accedere
come in presenza di semaforo verde:
BS = 0 risorse ocoupate, cio® 0) risorse libere e quindi il semaforo & rosso.
Le istruzioni di P(S) e V(S) incrementano ¢ deerementano la moltey
» quando viene effettaata una P(S) sti semaforo che ha valore >) ne
valore, dato che viene occupata “una sua parte”;
» quando viene effetmata una V(S) su un semaforo viene Inerementato i una unita tl suo valore
dato che ne viene rese disponibile “una parte” per gi altri processi,
jeitd di risorsa ibera
sne decrementato di 1 il suo