ProvaTeorica 2013.05.30

From Sistemi Operativi
Revision as of 15:52, 2 May 2014 by Stanislao (talk | contribs)
Jump to navigation Jump to search

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">