CAPITOLO 25 LETTORI / SCRITTORI - Biagio Catalanosistemioperativi/... · CAPITOLO 25 – LETTORI /...
Transcript of CAPITOLO 25 LETTORI / SCRITTORI - Biagio Catalanosistemioperativi/... · CAPITOLO 25 – LETTORI /...
-
CAPITOLO 25 LETTORI / SCRITTORI
Un altro problema classico che si incontra quando si tratta del tema della concorrenza e
sincronizzazione e che utile sia a scopo didattico che come termine di paragone con i problemi di
progettazione quello che viene chiamato problema dei lettori/scrittori.
Il problema ha la seguente definizione: c unarea di dati condivisa fra vari processi (questa pu
essere un file, un blocco di memoria, o un banco di registri del processore) ed esistono dei processi
che concorrono per lutilizzo dellarea: alcuni possono solo leggere i dati (lettori), altri possono solo
scrivere (scrittori).
Prima di analizzare il problema dei lettori/scrittori bene evidenziare le differenze con altri due
classici problemi: il problema generale della mutua esclusione e il problema del
produttore/consumatore. Nel problema dei lettori/scrittori, i lettori non possono essere anche scrittori,
e gli scrittori non possono leggere. Se consideriamo come caso pi generale quello in cui tutti i
processi possono sia leggere che scrivere possibile risolvere il problema dichiarando la porzione
nella quale i processi accedono ai dati come sezioni critiche e quindi utilizzare la soluzione generale
per la mutua esclusione. La ragione per cui ci si pone nel problema particolare che si possono
trovare soluzioni pi efficienti rispetto alla soluzione generale che risulterebbe essere di una
lentezza inaccettabile in questo caso.
Se ad esempio si considera come area condivisa il catalogo di una biblioteca avremo gli utenti
normali che leggono il catalogo per cercare un libro e un paio di bibliotecari che si occupano di
aggiornare il catalogo. Applicando la soluzione generale, ogni accesso al catalogo sarebbe trattato
come sezione critica per cui un solo lettore per volta avrebbe accesso al catalogo causando cos un
ritardo intollerabile. Allo stesso tempo importante impedire agli scrittori di interferire tra loro, ed
necessario impedire ai lettori di leggere mentre ci sono delle operazioni di scrittura in corso, per
evitare laccesso ad informazioni non corrette.
possibile considerare il problema del produttore/consumatore semplicemente come un caso
speciale del problema dei lettori/scrittori con un solo scrittore (il produttore) e un solo lettore (il
consumatore)? La risposta no, perch il produttore non solo uno scrittore, ma deve leggere i
puntatori della coda per stabilire dove mettere il prossimo elemento, e deve stabilire se il buffer
pieno; analogamente il consumatore non solo un lettore, perch deve modificare i puntatori della
coda per riflettere il fatto che un elemento stato rimosso dal buffer.
Vincoli del problema
Verranno di seguito esaminate due soluzioni del problema, prima per si riassumono le condizioni
che devono essere soddisfatte:
1. pi lettori possono leggere il file contemporaneamente.
2. solo uno scrittore alla volta pu scrivere nel file.
3. se uno scrittore sta scrivendo nel file, nessun lettore pu leggerlo
4. gli scrittori non possono leggere
5. i lettori non possono essere anche scrittori
-
Soluzione del problema con priorit ai processi lettori
Nella soluzione che usa i semafori vengono utilizzate le seguenti variabili e semafori:
1. la variabile globale numlettori usata per tenere traccia del numero di lettori; 2. il semaforo x usato per assicurarsi che numlettori sia aggiornata correttamente; 3. il semaforo wsem serve per garantire la mutua esclusione: i processi scrittori quando
accedono allarea condivisa utilizzano questo semaforo per impedire agli altri processi (sia
scrittori che lettori) di accedervi. Anche i processi lettori utilizzano il semaforo wsem, infatti
il primo lettore che tenta di leggere verifica che non ci siano scrittori nellarea condivisa
controllando il valore di wsem e lo setta per impedire ai processi scrittori di accedere allarea.
Altri processi lettori che intendono accedere allarea condivisa non si fermano su wsem ma
possono eseguire loperazione di lettura.
Soluzione del problema usando i semafori: priorit ai lettori
procedure scrittore; begin
repeat
wait(wsem);
SCRIVI_UNIT;
signal(wsem);
forever;
end; procedure lettore;
begin
repeat
wait(x);
numlettori:=numlettori+1;
if numlettori=1 then
wait(wsem); signal(x);
LEGGI_UNIT;
wait(x);
numlettori:=numlettori-1;
if numlettori=0 then
signal(wsem); signal(x);
forever;
end;
Priorit agli scrittori
Nella soluzione precedente i lettori hanno la priorit: quando un lettore inizia ad accedere ai dati, i
lettori possono mantenere il controllo dellarea dati finch c un lettore attivo, quindi gli scrittori
rischiano unattesa perenne.
Di seguito viene mostrata una soluzione che impedisce a nuovi lettori di accedere ai dati se qualche
scrittore ha dichiarato di voler effettuare una scrittura; sono stati aggiungi i seguenti semafori e
variabili per gli scrittori:
1. un semaforo rsem che blocca i lettori quando c almeno uno scrittore che desidera accedere ai dati;
-
2. una variabile numscrittori che controlla il numero di scrittori per gestire rsem; 3. un semaforo y che controlla laggiornamento di numscrittori; 4. un semaforo z che impedisce la formazione di una lunga coda di lettori sul semaforo rsem; in
questo modo i processi scrittori che intendono accedere allarea condivisa possono saltare la
coda. Con lutilizzo del semaforo z ad un solo lettore permesso di entrare nella coda di rsem
mentre tutti gli altri attendono su z prima di passare al semaforo rsem.
Analizziamo i due processi
procedure scrittore;
begin
repeat
wait(y); il processo verifica il semaforo y,
se positivo lo decrementa
e accede alla variabile numscrittori,
altrimenti attende
numscrittori:=numscrittori+1; incrementa la variabile numscrittori
if numscrittori=1 then se numscrittori ha valore 1 allora wait(rsem); controlla il semaforo rsem e
se positivo lo decrementa
(impedendo ai lettori di accedere allarea condivisa)
signal(y); rilascia la variabile numscrittori
incrementando il semaforo y
wait(wsem); se wsem positivo, lo decrementa
e accede allarea condivisa
(in questo modo impedisce ad altri scrittori
di accedere contemporaneamente)
SCRIVI_UNITA; Scrive
signal(wsem); Incrementa il semaforo wsem
e rilascia larea condivisa
wait(y); il processo verifica il semaforo y,
se positivo lo decrementa e accede
alla variabile numscrittori, altrimenti attende.
numscrittori:=numscrittori-1;Decrementa la variabile numscrittori
if numscrittori=0 Se numscrittori uguale a zero vuol dire
then signal(rsem); che non ci sono scrittori in attesa e incrementa il
semaforo rsem consentendo ai lettori
di leggere nellarea condivisa
signal(y); Incrementa il semaforo y consentendo luso
da parte degli altri processi
della variabile numscrittori forever
end;
-
procedure lettore;
begin
repeat
wait(z); controlla il semaforo z, se positivo lo decrementa
e continua, altrimenti attende.
wait(rsem); Controlla il semaforo rsem, se positivo vuol dire
che non ci sono scrittori in attesa di leggere
wait(x); controlla il semaforo x, se positivo lo decrementa
e pu accedere alla variabile numlettori.
numlettori:=numlettori+1; Incrementa la variabile numlettori
if numlettori=1 then Se numlettori uguale a 1 allora wait(wsem); controlla se ci sono scrittori nellarea condivisa.
Attende che wsem gli dia il via libera
per procedere alla lettura
signal(x); Incrementa i semafori x, rsem e z e consente
signal(rsem); ad altri processi di effettuare i controlli
signal(z); necessari per accedere allarea condivisa
LEGGI_UNITA; Effettua la lettura dellarea condivisa
wait(x); Controlla il semaforo x, se positivo pu
numlettori:=numlettori-1; accedere alla variabile numlettori che andr a decrementare.
if numlettori=0 then Se numlettori uguale a zero allora signal(wsem); ncrementa il semaforo wsem in modo da
indicare che non ci sono lettori nellarea condivisa.
signal(x); Incrementa il semaforo x concedendo ad altri
processi che ne fanno richiesta di
accedere alla variabile numlettori forever
end;