Caricare documenti e articoli online 
INFtub.com è un sito progettato per cercare i documenti in vari tipi di file e il caricamento di articoli online.


 
Non ricordi la password?  ››  Iscriviti gratis
 

COSTRUTTO MONITOR: PROBLEMA LETTORI-SCRITTORI

informatica



COSTRUTTO MONITOR: PROBLEMA LETTORI-SCRITTORI


Riconsideriamo il problema dei lettori scrittori. Ricordiamo che la politica di assegnazione ottimale della risorsa (pag. 80) stabilisce che un nuovo lettore non possa acquis 727h75h ire la risorsa se c'è uno scrittore in attesa, e che tutti i lettori sospesi al termina di una scrittura abbiano la priorità sul successivo scrittore.


Indichiamo allora con:

- num_lettori : numero dei processi lettori attivi sulla risorsa;

- occupato : variabile booleana che vale true se la risorsa è occupata da uno scrittore;

- ok_lettura, ok_scrittura : variabili condition su cui si sospendono rispettivamente lettori e scrittori.


Il codice è:


Type lettori_scrittori = MONITOR ;

var num_lettori : integer ;

occupato : boolean ;

ok_lettura, ok_scrittura : condition ;




Procedure entry Inizio_lettura ;

begin

if occupato or ok_scrittura.queue then

ok_lettura.wait ;

num_lettori : = num_lettori + 1 ;

ok_lettura.signal ;

end ;


Quando un lettore viene sbloccato (a causa dell'uscita di uno scrittore), grazie all'istruzione ok_lettura.signal esso sblocca a sua volta un altro lettore. Lo stesso farà quest'ultimo con un altro lettore in attesa, e così via. In questo modo si realizza la 'liberazione a cascata' di tutti gli eventuali lettori in attesa. Ricordiamo che detta istruzione non ha effetto se non ci sono processi da sbloccare. Vediamo ora la procedure di fine lettura.


Procedure entry Fine_lettura ;

begin

num_lettori : = num_lettori - 1 ;

if num_lettori = 0 then ok_scrittura.signal ;

end ;


Quando tutti i processi lettori sono usciti, è necessario e sufficiente offrirsi di liberare un eventuale scrittore bloccato. Se non esiste alcuno scrittore in attesa, sicuramente non esisteranno neanche lettori in attesa.


Procedure entry Inizio_scrittura ;

begin

if num_lettori <> 0 or occupato then

ok_scrittura.wait ;

occupato : = true ;

end ;


Procedure entry Fine_scrittura ;

begin

occupato : = false ;

if ok_lettura.queue then

ok.lettura.signal 

else ok_scrittura.signal ;

end ;


begin

num_lettori : = 0 ;

occupato : = false ;

end ;






Privacy




Articolo informazione


Hits: 2515
Apprezzato: scheda appunto

Commentare questo articolo:

Non sei registrato
Devi essere registrato per commentare

ISCRIVITI



Copiare il codice

nella pagina web del tuo sito.


Copyright InfTub.com 2024