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