LOVE85
10-02-2007, 10:25
Salve io vorrei solo capire swe ho capito bene come devo fare conquesto progetto:
Realizzare due implementazioni in C che realizzino con Semafori e Monitor una soluzione
concorrente al seguente problema:
Il Bar Sport
Nel bar Sport il barista prepara i caffè posizionando le tazzine piene sul bancone del bar in attesa dei clienti (che sono M).
Sul bancone al massimo possono essere posizionate N tazzine (N<M).
Quando il bancone è pieno di tazzine di caffè il barista si sospende mettendosi a leggere la Gazzetta dello Sport.
Man mano che arrivano, i clienti prendono una tazzina di caffè, ma prima di berlo devono zuccherarlo e una sola zuccheriera è disponibile.
Una volta zuccherato e bevuto il caffè, i clienti escono dal bar per fumarsi una sigaretta.
Una volta terminata la sigaretta i clienti tornano dentro al bar per prendere un altro caffè
Il cliente che beve l’ultima tazzina di caffè sveglia il barista, interrompendo la sua lettura.
I clienti che nel frattempo arrivano al bar e vogliono bere il caffè si sospendono in attesa che il barista abbia finito di riempire il bancone di tazzine di caffè.
Quando il barista ha riempito il bancone allora si occupa di svegliare i clienti in attesa
del caffè.
La soluzione proposta deve assicurare il massimo grado di parallelismo, non deve usare
busy waiting, ne’ generare deadlock o starvation. Commentare in modo chiaro il codice.
Il mio algoritmo pensato è:
#define tazzine 5
MEX: Sono le ore 7:00 e il barista sta aprendo il bar
SLEEP: 5 sec
MEX: Il barista ha aperto il bar.
SLEEP: 5 sec
MEX: Il barista inizia a prepare le tazzine
CICLO:
FOR (I=0; I<TAZZINE I++)
{
IF (TAZZINE<2)
IL BARISTA HA PREPARATO %d TAZZINA (%d = tazzINE)
ELSE
IL BARISTA HA PREPARATO %d taZZINE (%d = tAZZINE)
tazzine++;
sleep 5 secondi
}
MEX: Fatto! il barista ha posizionato %D TAzzine sul bancone. Ora va a leggere la gazzetta dello sport. (stato di waiting)
MEX: Dopopochi secondi arrivano con la random m clienti (FARei una random tra 1,3,6 clienti...
MEX: I clienti sono seduti davanti al bancone
CICLO:
FOR I=0; I<CLIENTI; I++)
{
CLIENTE numero %D prende zuccheriera.
SLEEP 2 SEC
CLIENTE HA ZUCCHERATO IL SUO CAFFE'
cliente++;
CLIENTE numero %D (clIENTE-1) passa la zuccheriera al cliente numero %D (cliente successivo)
}
MEX: dopo che tutti hanno finito di bere il caffè
Vanno a fumarsi la sigaretta
CICLO: simile a quello di prima solo che si accendo la sigaretta uno ogni tanto...penso che sia così no?
Però come faccio a dire che l'ultimo cliente che ha bevuto la tazzina attiva dallo stato di wait del barista per far in modo che il barista prepari altro caffè?
Come faccio a mettere in waiting gli altri clienti affincè il barista non ha riposizionato n tazzine? Con un if? I semafori e monitor come li implemento?
Vorreei solo sapere se l'algoritmo va bene ecome fare l'implementazione dei semafori.
Grazie
Cordiali Saluti
Non voglio mica farvi impazzire con sta roba che a me hanno fatto impazzire!!!
Realizzare due implementazioni in C che realizzino con Semafori e Monitor una soluzione
concorrente al seguente problema:
Il Bar Sport
Nel bar Sport il barista prepara i caffè posizionando le tazzine piene sul bancone del bar in attesa dei clienti (che sono M).
Sul bancone al massimo possono essere posizionate N tazzine (N<M).
Quando il bancone è pieno di tazzine di caffè il barista si sospende mettendosi a leggere la Gazzetta dello Sport.
Man mano che arrivano, i clienti prendono una tazzina di caffè, ma prima di berlo devono zuccherarlo e una sola zuccheriera è disponibile.
Una volta zuccherato e bevuto il caffè, i clienti escono dal bar per fumarsi una sigaretta.
Una volta terminata la sigaretta i clienti tornano dentro al bar per prendere un altro caffè
Il cliente che beve l’ultima tazzina di caffè sveglia il barista, interrompendo la sua lettura.
I clienti che nel frattempo arrivano al bar e vogliono bere il caffè si sospendono in attesa che il barista abbia finito di riempire il bancone di tazzine di caffè.
Quando il barista ha riempito il bancone allora si occupa di svegliare i clienti in attesa
del caffè.
La soluzione proposta deve assicurare il massimo grado di parallelismo, non deve usare
busy waiting, ne’ generare deadlock o starvation. Commentare in modo chiaro il codice.
Il mio algoritmo pensato è:
#define tazzine 5
MEX: Sono le ore 7:00 e il barista sta aprendo il bar
SLEEP: 5 sec
MEX: Il barista ha aperto il bar.
SLEEP: 5 sec
MEX: Il barista inizia a prepare le tazzine
CICLO:
FOR (I=0; I<TAZZINE I++)
{
IF (TAZZINE<2)
IL BARISTA HA PREPARATO %d TAZZINA (%d = tazzINE)
ELSE
IL BARISTA HA PREPARATO %d taZZINE (%d = tAZZINE)
tazzine++;
sleep 5 secondi
}
MEX: Fatto! il barista ha posizionato %D TAzzine sul bancone. Ora va a leggere la gazzetta dello sport. (stato di waiting)
MEX: Dopopochi secondi arrivano con la random m clienti (FARei una random tra 1,3,6 clienti...
MEX: I clienti sono seduti davanti al bancone
CICLO:
FOR I=0; I<CLIENTI; I++)
{
CLIENTE numero %D prende zuccheriera.
SLEEP 2 SEC
CLIENTE HA ZUCCHERATO IL SUO CAFFE'
cliente++;
CLIENTE numero %D (clIENTE-1) passa la zuccheriera al cliente numero %D (cliente successivo)
}
MEX: dopo che tutti hanno finito di bere il caffè
Vanno a fumarsi la sigaretta
CICLO: simile a quello di prima solo che si accendo la sigaretta uno ogni tanto...penso che sia così no?
Però come faccio a dire che l'ultimo cliente che ha bevuto la tazzina attiva dallo stato di wait del barista per far in modo che il barista prepari altro caffè?
Come faccio a mettere in waiting gli altri clienti affincè il barista non ha riposizionato n tazzine? Con un if? I semafori e monitor come li implemento?
Vorreei solo sapere se l'algoritmo va bene ecome fare l'implementazione dei semafori.
Grazie
Cordiali Saluti
Non voglio mica farvi impazzire con sta roba che a me hanno fatto impazzire!!!