Difference between revisions of "ProvaTeorica 2013.05.30"

From Sistemi Operativi
Jump to navigation Jump to search
Line 2: Line 2:
  
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
 +
 
/* Esercizio c.1: scrivere un monitor eventp che realizzi un servizio di sincronizzazione cosi' definito:
 
/* 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.
 
procedure entry EP *create(unsigned value): crea un nuovo descrittore. Ogni descrittore ha un contatore associato.
Line 73: Line 74:
 
delete(d);
 
delete(d);
 
}
 
}
 +
 
</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">