Il 0% ha trovato utile questo documento (0 voti)
109 visualizzazioni7 pagine

Semafori

Caricato da

api-285399009
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
109 visualizzazioni7 pagine

Semafori

Caricato da

api-285399009
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF o leggi online su Scribd
Sei sulla pagina 1/ 7
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

Potrebbero piacerti anche