Un distibutore di benzina ha N pompe e 1 serbatoio della capacità di M litri. Ogni automobile all’arrivo richiede una specifica quantità di benzina. Il serbatoio è rifornito da una autobotte che lo riempie fino alla capacità massima e solo se nessuna automobile sta facendo rifornimento.
Le automobili possono fare benzina solo se c’è una pompa libera, se la quantità di benzina richiesta è disponibile e se l’autobotte non sta riempiendo il serbatorio.
Si descriva una soluzione in uno pseudo linguaggio che ottimizzi l’accesso alle risorse usando semafori e processi.
sem distributore = 1;
int occupate = 0;
sem serbatoio = 1;
int disponibile = M;
sem auto = 1;
char autobotte = no;
autobotte(){
wait(distributore);
autobotte = si;
signal(distributore);
wait(auto);
riempi();
disponibile = M;
signal(auto);
autobotte = no;
}
automobile(){
wait(distributore);
if(occupate < N && autobotte == no){
occupate++;
if(occupate == 1) wait(auto);
signal(distributore);
richiesta = rand(1..20);
wait(serbatoio);
if(richiesta > disponibile)
signal(serbatoio)
else{
disponibile -= richiesta;
signal(serbatoio)
faibenzina();
}
wait(distributore);
occupate--;
if(occupate == 0)signal(auto);
signal(distributore);
}else{
signal(distributore);
}
}