CAPITOLO 25 LETTORI / SCRITTORI - Biagio Catalanosistemioperativi/... · CAPITOLO 25 – LETTORI /...

download CAPITOLO 25 LETTORI / SCRITTORI - Biagio Catalanosistemioperativi/... · CAPITOLO 25 – LETTORI / SCRITTORI Un altro problema classico che si incontra quando si tratta del tema della

If you can't read please download the document

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;