Difference between revisions of "ProvaTeorica 2012.07.16"

From Sistemi Operativi
Jump to navigation Jump to search
(Created page with "[http://www.cs.unibo.it/~renzo/so/compiti/2012-07-16.tot.pdf Link Testo] <h2>Esercizio C.2</h2> Mia Soluzione: <syntaxhighlight lang="C"> #define RED 0 #define BLUE 1 //resti...")
 
Line 45: Line 45:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
- Midolo
 
- Midolo
 +
 +
 +
<syntaxhighlight lang="C">
 +
#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(colore) {
 +
if (morethan75p(colore)) {
 +
waiting.dequeue()
 +
oktoenter.signal()
 +
}
 +
}
 +
 +
procedure entry enter(colore) {
 +
if (morethan75p(colore)==false) {
 +
waiting.enqueue(colore)
 +
oktoenter.wait()
 +
}
 +
running[colore]++
 +
checkwakeup(waiting.head()) // head resituisce l'elemento in testa senza rimuoverlo
 +
}
 +
 +
procedure entry exit(colore) {
 +
running[colore]--
 +
checkwakeup(waiting.head())
 +
}
 +
}
 +
 +
/* 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 */
 +
</syntaxhighlight>
 +
Daniele Cortesi

Revision as of 16:57, 28 March 2014

Link Testo

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(colore) {
		if (morethan75p(colore)) { 
			waiting.dequeue()
			oktoenter.signal()
		}
	}
	
	procedure entry enter(colore) {
		if (morethan75p(colore)==false) {
			waiting.enqueue(colore)
			oktoenter.wait()
		}
		running[colore]++
		checkwakeup(waiting.head()) // head resituisce l'elemento in testa senza rimuoverlo
	}
	
	procedure entry exit(colore) {
		running[colore]--
		checkwakeup(waiting.head())
	}
}

/* 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