Difference between revisions of "Prova Teorica 2007.07.12"
Jump to navigation
Jump to search
(Created page with "=[http://www.cs.unibo.it/~renzo/so/compiti/2007-07-12.tot.pdf TESTO COMPITO]= =CONCORRENZA= ==Esercizio 1== <syntaxhighlight lang="Java"> /* In una situazione ideale, il gioc...") |
|||
Line 3: | Line 3: | ||
==Esercizio 1== | ==Esercizio 1== | ||
<syntaxhighlight lang="Java"> | <syntaxhighlight lang="Java"> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
monitor oca | monitor oca | ||
{ | { | ||
Line 18: | Line 8: | ||
int playerPosition[N] = { 0, ..., 0 }; | int playerPosition[N] = { 0, ..., 0 }; | ||
bool winner = false; | bool winner = false; | ||
+ | bool blocked[N] = { false, ..., false }; | ||
int turn = 0; | int turn = 0; | ||
blockedPlayer = {} // Python-like dictionary | blockedPlayer = {} // Python-like dictionary | ||
Line 51: | Line 42: | ||
} | } | ||
− | turn = i + 1 % N; | + | turn = (i + 1) % N; |
while (blocked[turn]) | while (blocked[turn]) | ||
− | + | turn = (turn + 1) % N; | |
− | |||
player[turn].signal(); | player[turn].signal(); | ||
Line 60: | Line 50: | ||
} | } | ||
} | } | ||
+ | |||
+ | /* | ||
+ | In una situazione ideale, il giocatore (n), terminata la giocata, segnala il giocatore (n + 1) e termina. | ||
+ | Solo dopo che il giocatore (n) ha terminato, il giocatore (n + 1) inizia la sua giocata. | ||
+ | Questa situazione ideale e' descrivibile mediante la politica Signal And Continue. | ||
+ | Con Signal Urgent, di converso, il giocatore (n) non termina l'esecuzione della procedure entry | ||
+ | fino a quando non la termina il giocatore (n + 1). Il giocatore (n + 1) non la termina fino a quando | ||
+ | non termina il giocatore (n + 2) et cetera. | ||
+ | Questo meccanismo dello Urgent Stack risulta inutilmente dispendioso in questa fattispecie. | ||
+ | */ | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
==Esercizio 2== | ==Esercizio 2== | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> |
Latest revision as of 12:57, 15 May 2014
TESTO COMPITO
CONCORRENZA
Esercizio 1
monitor oca
{
condition player[N];
int playerPosition[N] = { 0, ..., 0 };
bool winner = false;
bool blocked[N] = { false, ..., false };
int turn = 0;
blockedPlayer = {} // Python-like dictionary
muovi(i, n)
{
if (winner)
return 2;
if (i != turn)
player[i].wait();
if (winner)
return 2;
playerPosition[i] += n;
if (playerPosition[i] >= 99)
{
winner = true;
for (int j = 0; j < i; j++)
player[j].signal();
for (int j = i + 1; j < N; j++)
player[j].signal();
return 1;
}
if (isMultiple13(playerPosition[i]))
{
if (blockedPlayer[playerPosition[i]])
blocked[blockedPlayer[playerPosition[i]]] = false;
blocked[i] = true;
blockedPlayer[playerPosition[i]] = i;
}
turn = (i + 1) % N;
while (blocked[turn])
turn = (turn + 1) % N;
player[turn].signal();
return 0;
}
}
/*
In una situazione ideale, il giocatore (n), terminata la giocata, segnala il giocatore (n + 1) e termina.
Solo dopo che il giocatore (n) ha terminato, il giocatore (n + 1) inizia la sua giocata.
Questa situazione ideale e' descrivibile mediante la politica Signal And Continue.
Con Signal Urgent, di converso, il giocatore (n) non termina l'esecuzione della procedure entry
fino a quando non la termina il giocatore (n + 1). Il giocatore (n + 1) non la termina fino a quando
non termina il giocatore (n + 2) et cetera.
Questo meccanismo dello Urgent Stack risulta inutilmente dispendioso in questa fattispecie.
*/
Esercizio 2
adoublesend(msg, dst1, dst2)
{
asend(msg, dst1);
arecv(dst1);
asend(msg, dst2);
}
adoublerecv(sender)
{
output = arecv(sender);
asend(OK, sender);
return output;
}
GENERALE
Esercizio 2
Max | Allocated | Need | Available | Safeness Conditions | |||||
A | B | A | B | A | B | A | B | ||
P2 | 5 | 10 | 3 | 5 | 2 | 5 | 3 | 4+x | x>=1 |
P1 | 6 | 5 | 0 | 3+x | 6 | y | 6 | 9+x | x=2-y |
P3 | 7 | 7 | 1 | 5 | 6+y | 2 | 6 | 12+2x | y=0 |
P4 | 7+x+z | 8+w | x+z | z | 7 | 8+z | 7 | 17+2x | w=2z, 8+z<=17+2x |
Range CI: | from | 6 | 15 | <=> y=0, x=2, w=2z, z<=13 | |||||
to | 19 | 28 | |||||||
step | 1 | 1 |