Problema dei Fumatori di sigarette Problema dei Fumatori di
by user
Comments
Transcript
Problema dei Fumatori di sigarette Problema dei Fumatori di
Problema dei Fumatori di
sigarette
1
• 3 processi “fumatori”
• 1 processo “tabaccaio”
• Ogni fumatore esegue ripetutamente un ciclo in cui
prepara una sigaretta e poi la fuma
• Per preparare la sigaretta un fumatore ha bisogno di 3
ingredienti (risorse):
– tabacco
– carta
– fiammiferi
Problema dei Fumatori di
sigarette
2
• Ogni processo “fumatore” possiede un solo ingrediente
(risorsa) in quantità illimitata:
– fumatore 1 possiede il tabacco
– fumatore 2 possiede la carta
– fumatore 3 possiede i fiammiferi
• Il tabaccaio possiede in infinita quantità tutti e tre gli
ingredienti
Problema dei Fumatori di
sigarette
3
• Il tabaccaio sceglie 2 ingredienti a caso, li mette a
disposizione, e si sospende
• Il fumatore che possiede il terzo ingrediente può
prelevare gli altri due, preparare la sigaretta e mettersi a
fumare.
• Quando termina lo segnala al tabaccaio che si sveglia, e
il processo si ripete.
1
Problema dei Fumatori di
sigarette
4
• scrivete 4 programmi concorrenti che simulino il
comportamento del tabaccaio e dei tre fumatori.
• Suggerimento: avrete probabilmente bisogno di un
semaforo per controllare ogni risorsa in gioco
• Alternativamente, potete usare un semaforo per ogni
fumatore
• Avrete anche bisogno di un semaforo per controllare il
comportamento del tabaccaio
Problema dei Fumatori di
sigarette
5
• Prima soluzione: usiamo 1 semaforo per ogni ingrediente +
1 semaforo per il tabaccaio
• Inizializzazione:
– carta = 0;
– tabacco = 0;
– fiammiferi = 0;
– tabaccaio = 0;
6
Problema dei Fumatori di sigarette
Tabaccaio:
repeat
sceglie 2 ingredienti a e b
if (a == fiammiferi) signal(fiammiferi)
else if (a == tabacco) signal(tabacco)
else if (a == carta) signal(carta)
stessa cosa per l’ingrediente b
wait(tabaccaio)
until false
2
7
Problema dei Fumatori di sigarette
Fumatore 1 /* possiede il tabacco */
repeat
wait(fiammiferi)
wait(carta)
<prepara sigaretta>
<fuma>
signal(tabaccaio)
until false
8
Problema dei Fumatori di sigarette
• Gli altri fumatori, hanno un codice analogo
– Ad esempio, se il secondo fumatore ha la carta, farà una
wait su fiammiferi e su tabacco
• Siamo sicuri che questa soluzione non produca deadlock o
starvation di uno dei processi?
• Cambia qualcosa l’ordine in cui ogni fumatore esegue le
wait sui due ingredienti che gli mancano?
Problema dei Fumatori di
sigarette
9
• Seconda soluzione: 1 semaforo per fumatore + 1 semaforo
per tabaccaio
• Inizializzazione:
– ha_tabacco = 0;
– ha_carta = 0;
– ha_fiammiferi = 0;
– tabaccaio = 0;
3
Problema dei Fumatori di sigarette
10
Tabaccaio
repeat
sceglie ingrediente da non vendere (A)
if (A == fiammiferi) signal(ha_fiammiferi)
else if (A == tabacco) signal(ha_tabacco)
else if (A == carta) signal(ha_carta)
metti a disposizione gli altri ingredienti
wait(tabaccaio)
until false
Problema dei Fumatori di sigarette
11
Fumatore 1 /* possiede il tabacco */
repeat
wait(ha_tabacco) /* viene sbloccato quando sono
disponibili gli altri ingredienti */
<prepara sigaretta>
<fuma>
signal(tabaccaio)
until false
12
Problema dei Fumatori di sigarette
• Gli altri fumatori, hanno un codice analogo
– Ad esempio, se il secondo fumatore ha la carta, farà una
wait su ha_carta
• Siamo sicuri che questa soluzione non produca deadlock o
starvation di uno dei processi?
• quale delle due soluzioni è migliore secondo voi?
4
13
Problema del barbiere addormentato
• In un negozio di barbiere vi sono:
– Una sala d’attesa con N sedie
– Una sedia del barbiere
• Quando non ci sono clienti il barbiere dorme
• Quando arriva un cliente:
– se le sedie sono tutte occupate, il cliente se ne va
– se ci sono sedie libere, il cliente aspetta di essere servito
– se il barbiere sta dormendo, allora il cliente lo sveglia e
viene servito
Problema del barbiere
addormentato
14
• Scrivete due programmi concorrenti che simulino il
comportamento del barbiere e del generico cliente
• Suggerimento: avrete bisogno di contare il numero di
posti liberi, e/o il numero di clienti presenti
• Avrete anche bisogno di indicare il fatto che il barbiere
sia occupato o meno
15
Problema del barbiere addormentato
• Soluzione: usiamo le seguenti strutture dati:
– 1 semaforo customers per controllare l’accesso alla
sala d’attesa inizializzato a 0
– 1 semaforo barber per il barbiere inizializzato a 0
– 1 variabile waiting=0 che indica il numero di clienti in
attesa
– 1 semaforo mutex inizializzato a 1 per l’accesso
mutuamente esclusivo a waiting (e non solo...)
5
Problema del barbiere
addormentato
16
Barbiere
repeat
wait(customers) /* dormo finché la sala è vuota */
wait(mutex)
waiting = waiting –1 /* un cliente in meno in attesa */
signal(barber)
signal(mutex)
cut_hair()
until false
Problema del barbiere
addormentato
17
Cliente
wait(mutex)
if (waiting < N) {
waiting = waiting + 1 /* mi conto anch’io */
signal(customers) /* sveglio il barb. se dormiva */
signal(mutex)
wait(barber) /* se il barb. è occupato aspetto */
get_haircut()
} else signal(mutex) /* se la sala è piena me ne vado */
Problema del barbiere
addormentato
18
• Notate: se assumiamo che sia possibile testare il valore
del semaforo “customers”, possiamo fare a meno della
variabile “waiting”.
6
Una soluzione “fair” al problema
dei Lettori-Scrittori
19
• Strutture dati condivise:
semaphore mutex = 1, scrivi = 1 , leggi = 1;
int numlettori= 0;
• Processo scrittore:
wait(leggi);
wait(scrivi);
…
esegui la scrittura del file
…
signal(scrivi);
signal(leggi);
Problema dei Lettori-Scrittori
20
• Processo lettore:
wait(leggi);
wait(mutex); // mutua escl. per aggiornare numlettori
numlettori++;
if numlettori == 1 wait(scrivi); // il primo lettore ferma
// eventuali scrittori
signal(mutex);
signal(leggi);
... leggi il file ...
wait(mutex);
numlettori--;
if numlettori == 0 signal(scrivi);
signal(mutex);
7