Difference between revisions of "Prova Teorica 16-07-2014"

From Sistemi Operativi
Jump to navigation Jump to search
Line 31: Line 31:
 
procedure entry object read(){
 
procedure entry object read(){
 
if ((count < MINELEM) || (count == (MAXELEM -1))  //se il buffer e' pieno oppure non ci sono min elem chiamo la wait
 
if ((count < MINELEM) || (count == (MAXELEM -1))  //se il buffer e' pieno oppure non ci sono min elem chiamo la wait
    okR.wait();
+
        okR.wait();
 
   eltype val = buffer[rear]; // assegno al val l'elemento che ho letto e poi aggiorno rear
 
   eltype val = buffer[rear]; // assegno al val l'elemento che ho letto e poi aggiorno rear
 
rear = ((rear + 1) % (MAXELEM -1 ));  // aggiorno rear;
 
rear = ((rear + 1) % (MAXELEM -1 ));  // aggiorno rear;
Line 40: Line 40:
 
procedure entry void write(int val){
 
procedure entry void write(int val){
 
if (count == buffer.length) //se il buffer e' pieno mi fermo
 
if (count == buffer.length) //se il buffer e' pieno mi fermo
    okW.wait();
+
          okW.wait();
 
   buffer[front] = val; //scrivo elemento
 
   buffer[front] = val; //scrivo elemento
 
   count++; //aggiorno i prodotti disponibili
 
   count++; //aggiorno i prodotti disponibili

Revision as of 07:08, 19 May 2015

scrivere il monitor mMbb che realizzi un meccanismo di un minmax bounded buffer.
Dopo le prime MIN operazioni di scrittura, un minmax bounded buffer deve sempre avere almeno MIN elementi e mai piu' di MAX
elementi (e' quindi limitato sia nell'ampiezza massima, sia nell'ampiezza minima).
Le funzioni (procedure entry) read e write del minmax bounded buffer hanno gli stessi argomenti e valori di ritorno di quelle del producer/consumer o del bounded buffer ordinario.

Soluzione di Stefano Zaniboni

/*esercizio 1*/

monitor mMbb{
	object[] buffer; //spazio di memorizzazione
	
	final int MAXELEM; // numero massimo di elementi che ci possono essere nel buffer
	final int MINELEM; //numero minimo di elementi --> numero di scritture minime
	
	condition okW; // dove mi fermo se non posso scrivere
	condition okR; // dove mi fermo se non posso leggere

	int count; // elementi presenti nel buffer
	int front;   // contatore al elemento prodotto
	int rear;   // contatore al elemento consumato	
	

	mMbb(){
		 buffer = new Object[MAXELEM];
    	count = rear = front = 0;
	}


	procedure entry object read(){
		if ((count < MINELEM) || (count == (MAXELEM -1))  //se il buffer e' pieno oppure non ci sono min elem chiamo la wait
    		     okR.wait();
  		eltype val = buffer[rear]; // assegno al val l'elemento che ho letto e poi aggiorno rear
		rear = ((rear + 1) % (MAXELEM -1 ));  // aggiorno rear;
		count--; // decremento count per dire che ho consumato un elemento
  		okW.signal(); // qui faccio signal sui produttori che adesso possono scrivere
  		return retval;
	}
	procedure entry void write(int val){
		if (count == buffer.length) //se il buffer e' pieno mi fermo
    		      okW.wait();
  		buffer[front] = val; //scrivo elemento
  		count++; //aggiorno i prodotti disponibili
  		front = ((front+1)%(MAXELEM - 1)); // aggiorno il contatore front a puntare nella prossima posizione
  		okR.signal();
	}

}