Prova Teorica 2009.01.14

From Sistemi Operativi
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;
}