Difference between revisions of "ProvaTeorica 2013.05.30"

From Sistemi Operativi
Jump to navigation Jump to search
Line 8: Line 8:
 
Value e' il valore iniziale del contatore.
 
Value e' il valore iniziale del contatore.
  
procedure entry void write(EP *d, unsigned value): se il contatore ha un valore tale che se si sommasse value causerebbe overflow, sospende il processo chiamante. In ogni caso (se la somma e' possibile senza overflow o quando la somma e' possibile senza overflow) somma value al valore del contatore.
+
procedure entry void write(EP *d, unsigned value): se il contatore ha un valore tale che se si sommasse value causerebbe overflow,  
 +
sospende il processo chiamante. In ogni caso (se la somma e' possibile senza overflow o quando la somma e' possibile senza overflow)  
 +
somma value al valore del contatore.
  
procedure entry unsigned read(EP *d): se il contatore ha valore nullo sospende il processo chiamante fino a che il contatore diventi non nullo. In ogni caso restituisce il valore del contatore e riporta il contatore al valore zero.
+
procedure entry unsigned read(EP *d): se il contatore ha valore nullo sospende il processo chiamante fino a che il contatore diventi non nullo.  
 +
In ogni caso restituisce il valore del contatore e riporta il contatore al valore zero.
  
 
procedure entry void close(EP *d): termina le operazioni del descrittore d e cancella il descrittore.
 
procedure entry void close(EP *d): termina le operazioni del descrittore d e cancella il descrittore.
Line 21: Line 24:
  
 
condition okToWrite, okToRead;
 
condition okToWrite, okToRead;
usigned int oldValue;
+
unsigned int oldValue;
  
 
struct EP {  
 
struct EP {  
unsigned int count;  
+
unsigned int count;  
 
} d;
 
} d;
  

Revision as of 15:54, 2 May 2014

Esercizio c.1

/* Esercizio c.1: scrivere un monitor eventp che realizzi un servizio di sincronizzazione cosi' definito:
procedure entry EP *create(unsigned value): crea un nuovo descrittore. Ogni descrittore ha un contatore associato.

Value e' il valore iniziale del contatore.

procedure entry void write(EP *d, unsigned value): se il contatore ha un valore tale che se si sommasse value causerebbe overflow, 
sospende il processo chiamante. In ogni caso (se la somma e' possibile senza overflow o quando la somma e' possibile senza overflow) 
somma value al valore del contatore.

procedure entry unsigned read(EP *d): se il contatore ha valore nullo sospende il processo chiamante fino a che il contatore diventi non nullo. 
In ogni caso restituisce il valore del contatore e riporta il contatore al valore zero.

procedure entry void close(EP *d): termina le operazioni del descrittore d e cancella il descrittore.
*/


monitor eventp{

#define OVERFLOW 999;

condition okToWrite, okToRead;
unsigned int oldValue;

struct EP { 
		unsigned int count; 
} d;



procedure entry EP *create(value){


d.count = value;

return d; 

}



procedure entry void write(EP *d, unsigned value){

	if(d.count+value > OVERFLOW)
			
			okToWrite.wait();
			d.count= d.count + value;
			okToRead.signal();
	else
			d.count = d.count + value;

}

		

procedure entry unsigned read (EP *d){

		if(d.count == NULL)
				
			okToRead.wait();
			oldValue = d.count;
			d.count = 0;
			okToWrite.signal();
			return oldValue;
		else
			oldValue=d.count;
			d.count=0;
			return oldValue;
}

procedure entry void close(EP* d){

			close(d);
			delete(d);
}