Difference between revisions of "ProvaTeorica 2013.05.30"

From Sistemi Operativi
Jump to navigation Jump to search
(Created page with "<h1> Esercizio 1g </h1> File:espag.jpg")
 
Line 1: Line 1:
<h1> Esercizio 1g </h1>
+
 
[[File:espag.jpg]]
+
<h2>Esercizio c.1</<h2>
 +
 
 +
/* 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;
 +
usigned 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);
 +
}
 +
<h2> Esercizio g.1 </h2>

Revision as of 15:49, 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{
  1. define OVERFLOW 999;
condition okToWrite, okToRead; usigned 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); }

Esercizio g.1