Difference between revisions of "ProvaTeorica 2012.07.16"
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
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