Problema dei produttori e dei consumatori
• Il problema dei produttori e dei consumatori appartiene alla categoria di problemi nei quali l’esecuzione di un processo dipende dall’esecuzione di un altro, per cui è necessaria una comunicazione asincrona tra i due processi.
Due categorie di processi
- Produttori, che scrivono su di una risorsa condivisa
- Consumatori, che leggono e azzerano la risorsa condivisa
Vincoli del problema
- Il produttore non può produrre un messaggio prima che qualche consumatore abbia letto il messaggio precedente.
- Il consumatore non può prelevare alcun messaggio fino a che un produttore non l’abbia depositato.
Nel caso più generale i messaggi sono depositati in un buffer di lunghezza N:
- Il produttore non può produrre un messaggio se il buffer è pieno.
- Il consumatore non può prelevare messaggi se il buffer è vuoto.
Una semplice soluzione
• Il buffer è una risorsa condivisa tra i processi (ad esempio un segmento di memoria condivisa), gestita come una coda.
- L’accesso dei produttori è regolato dal semaforo N-ario spazio_disponibile.
- L’accesso dei consumatori è regolato dal semaforo N-ario messaggio_disponibile.
semaforo messaggio_disponibile=0; semaforo spazio_disponibile = N; queue_message coda;
void invio (messaggio m) {
- wait (spazio_disponibile);
- accoda il messaggio m;
- signal (messaggio_disponibile);
messaggio ricezione() {
- messaggio m;
- wait (messaggio_disponibile);
- m = preleva primo messaggio in coda;
- signal (spazio_disponibile);
- return m;
Problemi di questa soluzione
• Ogni processo impegna il buffer in tutta la durata della produzione/consumazione ⇒ non è possibile alcun parallelismo tra i produttori (consumatori) ⇒ non è possibile distinguere tra richiesta, uso e rilascio della risorsa buffer.
Una seconda soluzione
semaforo messaggio_disponibile=0; semaforo spazio_disponibile = N; semaforo mutex_prod=1; semaforo mutex_cons=1; messaggio buffer[N]; int testa, coda;
void invio (messaggio m) {
- wait (spazio_disponibile);
- wait(mutex_prod);
- buffer[coda]=m;
- coda=(coda++)mod N;
- signal(mutex_prod);
- signal (messaggio_disponibile);
messaggio ricezione() {
- messaggio m;
- wait (messaggio_disponibile);
- wait(mutex_cons);
- m = buffer[testa];
- testa= (testa++) mod N;
- signal(mutex_cons);
- signal (spazio_disponibile);
- return m;
-
Sistemi operativi - teoria completa
-
Sistemi operativi - appunti
-
Sistemi operativi
-
Sistemi operativi - Appunti