Comments
Description
Transcript
Sistemi Operativi
Sistemi Operativi Lezione 7-bis Esercizi Esercizio • Problema dei lettori e scrittori • Un insieme di processi condivide un file dal quale alcuni possono solo leggere i dati, altri solo scriverli • Più lettori possono leggere simultaneamente • Un solo scrittore per volta può scrivere • Quando uno scrittore scrive, nessun lettore può leggere • Diverso da Prod/cons • i lettori non modificano i puntatori al buffer • i produttori leggono i puntatori, gli scrittori no AA 2001/02 ©Bruschi, Rosti 2 Corso: Sistemi Operativi Esercizio • Sviluppare una soluzione al problema della corretta sincronizzazione degli accessi • 1 scrittore, 1 lettore • accessi in mutua esclusione al file • sia dello scrittore sia del lettore rispetto a questo • 1 scrittore, n lettori • n scrittori, n lettori • considerare chi ha priorità, lettori o scrittori AA 2001/02 ©Bruschi, Rosti 3 Corso: Sistemi Operativi M scrittori, n lettori con priorità • Gli scrittori aspettano che tutti i lettori abbiano terminato • Gli scrittori scrivono in mutua esclusione • I lettori devono sapere quanti sono • Se c’è un solo lettore, deve aspettare che eventuali scrittori finiscano • Lettori che arrivano quando altri stanno già leggendo procedono senza aspettare AA 2001/02 ©Bruschi, Rosti 4 Corso: Sistemi Operativi M scrittori, n lettori con priorità Lettori_scrittori(); int numlett; /* contiamo solo i lettori perché gli scrittori li aspettano */ semaphore x = 1, scritt = 1; /* x per contare I lettori correttamente; scritt per la mutua esclusione */ { numlett = 0; parbegin lettore; scrittore; parend } AA 2001/02 ©Bruschi, Rosti 5 Corso: Sistemi Operativi M scrittori, n lettori con priorità scrittore(); { while TRUE do { down(scritt): scrivi_dato(); up(scritt); } } AA 2001/02 ©Bruschi, Rosti 6 lettore(); { while TRUE do { down(x); numlett = numlett + 1; if numlett == 1 down(scritt); up(x); leggi_dato(); down(x); numlett = numlett - 1; if numlett == 0 up(scritt); up(x); } } Corso: Sistemi Operativi M scrittori, n lettori con priorità • Che tipo di semafori abbiamo usato? • Si potrebbe usare un semaforo generalizzato per contare i lettori? • Cosa succede nei seguenti casi • Solo lettori presenti • Solo scrittori presenti • Lettori e scrittori presenti ma • un lettore è arrivato primo • uno scrittore è arrivato primo • I lettori continuano ad arrivare prima che l’ultimo finisca • In coda su scritt ci sono sia lettori che scrittori AA 2001/02 ©Bruschi, Rosti 7 Corso: Sistemi Operativi M scrittori con priorità, n lettori • I lettori si bloccano se c’è almeno uno scrittore che ha segnalato di voler accedere ai dati • Dobbiamo sapere quanti sono gli scrittori • L’aggiornamento del numero di scrittori deve essere fatto in mutua esclusione • Quando c’è un solo scrittore, aspetta sulla coda dei lettori per ragioni di priorità AA 2001/02 ©Bruschi, Rosti 8 Corso: Sistemi Operativi M scrittori con priorità, n lettori lettore(); { while TRUE do { aggiorna il numero di lettori in mutua esclusione; se c’e` un solo lettore, lascia passare gli scrittori; leggi_dato(); aggiorna il numero di lettori in mutua esclusione; se non ci sono piu` lettori, lascia passare gli scrittori; } } AA 2001/02 ©Bruschi, Rosti scrittore(); { while TRUE do { aggiorna il numero di scrittori in mutua esclusione; se c’e` un solo scrittore, aspetta che i lettori finiscano; scrivi_dato() in mutua esclusione; aggiorna il numero di scrittori in mutua esclusione; se non ci sono piu` scrittori, lascia passare i lettori; } } 9 Corso: Sistemi Operativi M scrittori con priorità, n lettori Lettori_scrittori(); int numlett, numscritt; semaphore x = 1, y = 1, lett = 1, scritt = 1; /* x per contare I lettori, y per gli scrittori; * scritt per la mutua esclusione degli scrittori, * lett per fare aspettare gli uni e gli altri */ { numlett = 0; numscritt = 0; parbegin lettore; scrittore; parend }AA 2001/02 ©Bruschi, Rosti 10 Corso: Sistemi Operativi M scrittori con priorità, n lettori lettore(); { while TRUE do { down(lett); down(x); numlett = numlett + 1; if numlett == 1 down(scritt); up(x); up(lett); leggi_dato(); down(x); numlett = numlett - 1; if numlett == 0 up(scritt); up(x); } } AA 2001/02 ©Bruschi, Rosti 11 scrittore(); { while TRUE do { down(y); numscritt = numscritt + 1; if numscrit == 1 down(lett); up(y); down(scritt); scrivi_dato(); up(scritt); down(y); numscritt = numscritt - 1; if numscritt == 0 up(lett); up(y); } } Corso: Sistemi Operativi M scrittori con priorità, n lettori • Cosa succede se • ci sono solo lettori • ci sono solo scrittori • per primo arriva un lettore poi lettori e scrittori • primo arriva uno scrittore poi lettori e scrittori • arrivano molti lettori poi uno scrittore AA 2001/02 ©Bruschi, Rosti 12 Corso: Sistemi Operativi M scrittori con priorità, n lettori Lettori_scrittori(); int numlett, numscritt; semaphore x = 1, y = 1, z = 1, lett = 1, scritt = 1; /* x per contare I lettori, y per gli scrittori; z per far aspettare lettori e scrittori * su code diverse; scritt per la mutua esclusione degli scrittori, * lett per fare aspettare un lettore e uno scrittore */ { numlett = 0; numscritt = 0; parbegin lettore; scrittore; parend }AA 2001/02 ©Bruschi, Rosti 13 Corso: Sistemi Operativi M scrittori con priorità, n lettori scrittore(); { while TRUE do { down(y); numscritt = numscritt + 1; if numscrit == 1 down(lett); up(y); down(scritt): scrivi_dato(); up(scritt); down(y); numscritt = numscritt - 1; if numscritt == 0 up(lett); up(y); } } AA 2001/02 ©Bruschi, Rosti 14 lettore(); { while TRUE do { down(z); down(lett): down(x); numlett = numlett + 1; if numlett == 1 down(scritt); up(x); up(lett); up(z); leggi_dato(); down(x); numlett = numlett - 1; if numlett == 0 up(scritt); up(x); } Corso: Sistemi Operativi } Osservazioni • La programmazione della concorrenza con i semafori non è facile • P e V, Up e Down sparpagliate nel codice • problema del corretto ordine di esecuzione di P e V • l’uso di P e V in ordine errato può portare a deadlock o a violazione della mutua esclusione • Proposte soluzioni alternative a livello di linguaggio di programmazione • monitor • primitiva di sincronizzazione di alto livello AA 2001/02 ©Bruschi, Rosti 15 Corso: Sistemi Operativi Altre soluzioni • A livello di linguaggio di programmazione • monitor • costrutto di linguaggio tipo ADT • Mediante primitive di comunicazione • sincronizzazione mediante scambio di messaggi con primitive bloccanti e no • Send(destination, msg)/receive(source, msg) • tipicamente usato in ambiente multiprocessore a memoria distribuita • Message Passing Interface • complesso e poco controllabile • problema dell’affidabilita dei canali, dell’autenticità dei messaggi, dei nomi dei partecipanti AA 2001/02 ©Bruschi, Rosti 16 Corso: Sistemi Operativi Monitor • Collezione di procedure, variabili, strutture dati raccolte in un pacchetto • i dati del monitor non sono accessibili al di fuori di esso • le procedure del monitor accedono ai dati condivisi • un processo può chiamare le procedure del monitor ovunque ma una sola per volta può essere in esecuzione • mutua esclusione • il monitor è un costrutto di linguaggio • il compilatore sa cosa fare nella traduzione AA 2001/02 ©Bruschi, Rosti 17 Corso: Sistemi Operativi Monitor I processi produttori e consumatori eseguono le procedure del monitor, senza preoccuparsi della mutua esclusione La mutua esclusione è implicita nell’uso del costrutto monitor La sezione critica è tutta raccolta nel monitor Più semplice da controllare AA 2001/02 ©Bruschi, Rosti 18 Corso: Sistemi Operativi Prod-cons con Monitor Una sola procedura del monitor è attiva alla volta AA 2001/02 ©Bruschi, Rosti Il buffer ha N slot 19 Corso: Sistemi Operativi Deadlock • Un insieme di processi è in deadlock se ciascuno di essi è in attesa di un evento che si può verificare solo grazie ad un altro processo dell’insieme, in una catena • Es. Due processi A e B usano lo stesso file in modo esclusivo e la stessa stampante durante la loro esecuzione. All’istante t A acquisisce il file indi viene sospeso, la CPU viene assegnata a B che acquisisce la stampante e poi si mette in attesa del file; quando la CPU torna ad A, A si mette in attesa della stampante • A questo punto nessuno dei due è più in grado di proseguire AA 2001/02 ©Bruschi, Rosti 20 Corso: Sistemi Operativi Deadlock • Il deadlock è caratterizzato da 4 condizioni necessarie 1. Accesso alle risorse in mutua esclusione 2. Hold and Wait • processi in possesso di risorse possono continuare a richiederne delle nuove, senza cedere quelle già acquisite anche se rimangono bloccati in attesa 3. Le risorse non sono prelazionabili 4. Attesa circolare • AA 2001/02 ©Bruschi, Rosti due o più processi sono in attesa di risorse usate da un altro del gruppo 21 Corso: Sistemi Operativi Deadlock • In genere sono usate 4 strategie per far fronte al deadlock • Ignorarlo • Rilevamento e ripristino • detection and recovery • Dynamic avoidance • si usa un’attenta strategia di allocazione risorse • Prevention • si tratta di fare in modo che una delle 4 condizioni necessarie non si verifichi mai AA 2001/02 ©Bruschi, Rosti 22 Corso: Sistemi Operativi