ProvaPratica 2010.07.12
http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf
Esercizio 1
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){
int i;
if(waiting[maxprio] == 0)
{
maxprio=0;
for(i=prio;i>=0;i--)
{
if(waiting[i]!=0)
{
maxprio=i;
break;
}
}
return maxprio;
}
monitor priocoop{
condition run[10];
int waiting[10]=0,0,0,0,0,0,0,0,0,0;
int maxprio=0;
int occupato=0;
procedure entry init(prio){
if(occupato==1)
{
if(maxprio < prio)
{
maxprio=prio;
}
waiting[prio]++;
run[prio].wait();
waiting[prio]--;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);
}
occupato=1;
}
procedure entry yield(prio){
run[maxprio].signal();
if(maxprio < prio)
{
maxprio=prio;
}
waiting[prio]++;
run[prio].wait();
waiting[prio]--;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);
}
procedure entry fini(prio){
occupato=0;
waiting[prio]--;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);
run[maxprio].signal();
}
Alessandro
//Processo con prioritá 0 = Processo con piú alta prioritá
//Processo con prioritá 9 = Processo con meno prioritá
monitor priocoop {
condition oktogo[10];
int wait[10] = 0,0,0,0,0,0,0,0,0;
int running;
priocoop.init(prio) {
if(running != 0) {
wait[prio]++;
oktogo[prio].wait;
wait[prio]--;
}
running++;
}
priocoop.yield(prio) {
running--;
for(int i = 0;i<10;i++) {
if(wait[i] != 0) {
oktogo[i].signal();
wait[prio]++;
oktogo[prio].wait;
wait[prio]--;
break();
}
}
running++;
}
priocoop.fini() {
running--;
for(int i = 0;i<10;i++) {
if(wait[i] != 0) {
oktogo[i].signal();
break();
}
}
}
}
-Midolo
//0: priorita' maggiore
//9: priorita' minore
cond oktoenter[10];
int count[10];
bool running = false;
//restituisce la priorita' maggiore che ha un processo in attesa
getprio() {
for(i=0;i<10;i++) {
if(count[i]>0)
break;
}
return i;
}
priocoop() {
init (prio) {
if (running) {
count[prio]++;
oktoenter[prio].wait();
count[prio]--;
}
running = true;
}
yield(prio) {
i=getprio();
if (i < 10) {
// running = false;
oktoenter[i].signal();
count(prio)++
oktoenter[proc].wait();
// running = true;
count[prio]--;
}
}
fini(prio){
i=getprio();
if(i<10)
oktoenter[i].signal;
else
running=false;
}
}
-Stefano B.
monitor priocoop{
condition oktoenter[10];
queue waiting[10];
procedure entry init(int prio){
if(!(prio >= 0 && prio<=9))
exit(0);
}
procedure entry yield(int prio){
int priority=-1;
for (i=0; i<10; i++) {
if (! waiting[i].isempty())
priority=i;
}
oktoenter[priority].signal();
if(priority>=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock
* in quanto le code sono vuote */
waiting[prio].enqueue();
oktoenter[prio].wait();
waiting[prio].dequeue();
}
}
procedure entry fini(){
int priority=-1;
for (i=0; i<10; i++) {
if (! waiting[i].isempty())
priority=i;
}
oktoenter[priority].signal();
}
}
Francesca e Giulia
Esercizio 2
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto
Process n: {
psend(dest, prio,msg) {
asend((msg, prio),dest);
}
precv(sender) {
while((msg,prio) = arecv(sender)) {
db[sender].insert((msg,prio));
}
return (db[sender].getpriortymax());
}
}
-Midolo
Esercizio 3
lock=-1;
Process P[i]{
while(true){
do{;}
while(twomult.op(lock)==lock);
//critical section
lock = -lock;
//no critical section
}
}
Inizialmente: a=1; b=1;
Primo processo: lock=-1 a=-1 b=1 Siccome lock!=b esce dal while.
Secondo processo: lock=-1 a=1 b=-1 Siccome lock==b non esce dal while e continua: lock=-1 a=1 b=-1 Si ripeterano sempre gli stessi valori, fino al cambio di valore di lock che passa da -1 a 1 così : lock=1 a=-1 b=-1; Siccome lock!=b esce dal while. Mentre l'altro processo si bloccherà poichè: lock=1 a=1 b=1; fino al ritorno di lock al valore -1; lock=-1 a=-1 b=1; C.V.D
Alessandro
Parte generale
Esercizio 1
a) Lo stato è SAFE per x >= 8
Esempio di sequenza:
COH valuta 2 = 20 → 15 → 30 → 0 → 30+x → 10+x → 32+x il seguito dipende dal valore di x
La sequenza è: 2 - 1 - 3 - 4
b1) con x = 8 e la sequenza: 2 - 4 si arriva in uno stato UNSAFE
b2) con x = 7 e la sequenza: 2 - 1 si è in uno stato SAFE
Giulia N.