Difference between revisions of "ProvaTeorica 2013.05.30"

From Sistemi Operativi
Jump to navigation Jump to search
Line 1: Line 1:
<h2>Esercizio c.1<h2>
+
<h2>Esercizio c.1</h2>
  
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">

Revision as of 15:52, 2 May 2014

Esercizio c.1

<syntaxhighlight lang="C">

/* 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); }

</syntaxhighlight lang="C">