Prova Teorica 2009.01.14
Jump to navigation
Jump to search
Esercizio 1: Scrivere un monitor che implementi un buffer limitato (SIZE elementi) dove i messaggi abbiano associata una priorita'. I processi produttori richiamano pbb.enqueue(m,prio) mentre i processi consumatori chiamano m=pbb.dequeue() I primi SIZE processi produttori pongono i loro elementi nel buffer senza bloccarsi, i successivi si fermano in attesa. Il consumatore deve sempre prendere l'elemento a priorita' massima fra quelli nel buffer *e* fra quelli in attesa.
struct el {
int prio;
condition c;
};
struct bufel {
T payload;
struct el prioc;
};
struct bufel buf[SIZE+1];
int nbuf, nqueue;
condition oktoread;
procedure entry void enqueue(T m, int prio) {
if(nbuf>=SIZE) {
el=new(struct el); el.prio=prio;
nqueue++; q.enqueue(el); nqueue--;
free(el);
}
buf[nbuf].prio=prio; buf[nbuf].payload=m;
nbuf++;
sort(buf, nbuf); //in ordine crescente
oktoread.signal();
}
procedure entry dequeu(void) {
if(nbuf+nqueue==0)
oktoread.wait()
if(nqueue>0) {
el=q.dequeue(); //quello a prio max
el.c.signal();
}
nbuf--;
return nuf[nbuf].payload;
}