ProvaTeorica 2012.07.16
Jump to navigation
Jump to search
Esercizio C.2
Mia Soluzione:
#define RED 0
#define BLUE 1
//restituisce 1 se c'e piu del 75% blue o 75% di red
//restituisce 0 se non c'e una maggiornza
int media(color){
int mediared;
int localinto = into;
if (color != NULL){
localinto[color]++;
}
mediared = ((100*localinto[0])/(localinto[0]+localinto[1]));
if(mediared >=75 || mediared < 25){
return 1;//75% di rossi o di blue
}else{
return 0;// non c'e maggioranza
}
}
monitor limcol{
conditon oktoenter[2];
int into[2];
enter(color){
if(media(color) != 1){// attendo perche' non c'e una maggioranza
oktoenter[color].wait();
}
into[color]++;
}
exit(color){
into[color]--;
if(media(1-color) == 1){
oktoenter[1-color].signal();
}else if(media(color) == 1){
oktoenter[color].signal();
}
}
}
- Midolo
#define ROSSO 0
#define BLU 1
monitor limcol {
condition oktoenter
int running[2] // numero di processi rossi [0] e blu [1] in esecuzione
queue waiting // coda dei colori dei processi in attesa
/* restituisce true se aggiungendo un processo del colore passato viene rispettato il 75%
dei processi di un colore */
bool morethan75p(colore) {
return (running[colore]+1>=running[1-colore]*3 || (running[colore]+1)*3<=running[1-colore])
}
// risveglia un processo del colore passato se è possibile farlo
void checkwakeup() {
if (waiting.empty() == false) {
colore=waiting.head() // head resituisce l'elemento in testa senza rimuoverlo
if (morethan75p(colore)) {
waiting.dequeue()
oktoenter.signal()
}
}
}
procedure entry enter(colore) {
if (morethan75p(colore)==false) {
waiting.enqueue(colore)
oktoenter.wait()
}
running[colore]++
checkwakeup()
}
procedure entry exit(colore) {
running[colore]--
checkwakeup()
}
}
/* la politica FIFO impedisce che si verifichi starvation, perché nel caso pessimo un processo
che vuole entrare dovrà attendere fino a che tutti quelli in esecuzione terminino */
Daniele Cortesi