Difference between revisions of "ProvaTeorica 2012.07.16"
		
		
		
		
		
		Jump to navigation
		Jump to search
		
				
		
		
	
| Line 92: | Line 92: | ||
| </syntaxhighlight> | </syntaxhighlight> | ||
| Daniele Cortesi | Daniele Cortesi | ||
| + | |||
| + | |||
| + | <syntaxhighlight lang="C"> | ||
| + | define RED 0 | ||
| + | define BLUE 1 | ||
| + | int majorcolor = -1 | ||
| + | int numproc[2] = 0,0 | ||
| + | cond oktoenter[2] | ||
| + | cond oktoexit[2] | ||
| + | |||
| + | |||
| + | monitor limcol{ | ||
| + | 	procedure entry enter(COL){ | ||
| + | 		if(COL == majorcolor){ | ||
| + | 			numproc[COL]++ | ||
| + | 			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] + 1)) >= 75) | ||
| + | 				oktoenter[1-COL].signal() | ||
| + | 		} | ||
| + | 		else if(COL == 1-majorcolor){ | ||
| + | 			if((proc[majorcolor]*100/(numproc[COL] + numproc[1-COL] + 1)) < 75) | ||
| + | 				oktoenter[COL].wait() | ||
| + | 			if(majorcolor == -1) | ||
| + | 				majorcolor == COL | ||
| + | 			numproc[COL]++ | ||
| + | 		} | ||
| + | 		else{ | ||
| + | 			numproc[COL]++ | ||
| + | 			majorcolor = COL | ||
| + | 		} | ||
| + | 	} | ||
| + | |||
| + | 	procedure entry exit(COL){ | ||
| + | 		if(numproc[COL] + numproc[1-COL] == 1){ | ||
| + | 			majorcolor = -1 | ||
| + | 			numproc[COL]-- | ||
| + | 			oktoenter[1-COL].signal() | ||
| + | 		} | ||
| + | 		else if(COL == majorcolor){ | ||
| + | 			if(((proc[majorcolor] - 1)*100/(numproc[COL] + numproc[1-COL] - 1)) < 75){ | ||
| + | 				oktoexit[COL].wait() | ||
| + | 			numproc[COL]-- | ||
| + | 			} | ||
| + | 		} | ||
| + | 		else if(COL == 1-majorcolor){ | ||
| + | 			numproc[COL]-- | ||
| + | 			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] - 1)) >= 75) | ||
| + | 				oktoexit[1-COL].signal() | ||
| + | 		} | ||
| + | 	} | ||
| + | } | ||
| + | |||
| + | |||
| + | </syntaxhighlight> | ||
| + | Fede | ||
Revision as of 17:51, 28 March 2014
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
define RED 0
define BLUE 1
int majorcolor = -1
int numproc[2] = 0,0
cond oktoenter[2]
cond oktoexit[2]
monitor limcol{
	procedure entry enter(COL){
		if(COL == majorcolor){
			numproc[COL]++
			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] + 1)) >= 75)
				oktoenter[1-COL].signal()
		}
		else if(COL == 1-majorcolor){
			if((proc[majorcolor]*100/(numproc[COL] + numproc[1-COL] + 1)) < 75)
				oktoenter[COL].wait()
			if(majorcolor == -1)
				majorcolor == COL
			numproc[COL]++
		}
		else{
			numproc[COL]++
			majorcolor = COL
		}
	}
	procedure entry exit(COL){
		if(numproc[COL] + numproc[1-COL] == 1){
			majorcolor = -1
			numproc[COL]--
			oktoenter[1-COL].signal()
		}
		else if(COL == majorcolor){
			if(((proc[majorcolor] - 1)*100/(numproc[COL] + numproc[1-COL] - 1)) < 75){
				oktoexit[COL].wait()
			numproc[COL]--
			}
		}
		else if(COL == 1-majorcolor){
			numproc[COL]--
			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] - 1)) >= 75)
				oktoexit[1-COL].signal()
		}
	}
}
Fede