Difference between revisions of "ProvaTeorica 2013.05.30"
Jump to navigation
Jump to search
Esercizio c.1</
(Created page with "<h1> Esercizio 1g </h1> File:espag.jpg") |
|||
| Line 1: | Line 1: | ||
| − | < | + | |
| − | + | <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{
- 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
- /
- define OVERFLOW 999;