Difference between revisions of "ProvaTeorica 2013.05.30"
Jump to navigation
Jump to search
Line 79: | Line 79: | ||
delete(d); | delete(d); | ||
} | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | <h2> Esercizio c.2 </h2> | ||
+ | |||
+ | <syntaxhighlight lang="C"> | ||
+ | |||
+ | /* I semafori v2p hanno come invariante 2*np <= nv + Init, dove np e' il numero di operazioni P completate, | ||
+ | nv e' il numero delle operazioni V completate e Init e' il valore iniziale (cioe' occorrono 2 operazioni V per sbloccare un processo che ha fatto P). | ||
+ | I semafori v2p hanno lo stesso potere espressivo dei semafori generali o no? | ||
+ | Produrre una dimostrazione della tesi sostenuta.*/ | ||
+ | |||
+ | /* I semafori v2p non hanno lo stesso potere espressivo di quelli generali | ||
+ | |||
+ | DIMOSTRAZIONE: prendo due processi P e Q in questo modo qui: */ | ||
+ | |||
+ | process P{ | ||
+ | |||
+ | while (true){ | ||
+ | |||
+ | P(); | ||
+ | |||
+ | printf(“sono p”); | ||
+ | |||
+ | } | ||
+ | } | ||
+ | |||
+ | process Q{ | ||
+ | |||
+ | while (true){ | ||
+ | |||
+ | printf(“sono q”); | ||
+ | |||
+ | V(); | ||
+ | |||
+ | } | ||
+ | } | ||
+ | |||
+ | /* inizializzo entrambi i semafori a 2 */ | ||
+ | |||
+ | semaforo v2p(2) | ||
+ | semaforo generale(2) | ||
+ | |||
+ | PPPQQQ // sequenza di avvicendamento dei processi | ||
+ | |||
+ | |||
+ | v2p(2) generale(2) // v2p VS generale | ||
+ | |||
+ | sono p sono p | ||
+ | sono p sono p | ||
+ | sono q sono q | ||
+ | sono q sono p | ||
+ | sono p sono q | ||
+ | sono q sono q | ||
+ | |||
+ | /* con la stessa sequenza di avvicendamento dei processi possiamo notare che l'output generato da entrambi i processi è diverso e quindi i semafori v2p non hanno lo stesso potere espressivo dei semafori generali | ||
</syntaxhighlight> | </syntaxhighlight> |
Revision as of 17:03, 2 May 2014
Testo del compito
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;
unsigned 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 c.2
/* I semafori v2p hanno come invariante 2*np <= nv + Init, dove np e' il numero di operazioni P completate,
nv e' il numero delle operazioni V completate e Init e' il valore iniziale (cioe' occorrono 2 operazioni V per sbloccare un processo che ha fatto P).
I semafori v2p hanno lo stesso potere espressivo dei semafori generali o no?
Produrre una dimostrazione della tesi sostenuta.*/
/* I semafori v2p non hanno lo stesso potere espressivo di quelli generali
DIMOSTRAZIONE: prendo due processi P e Q in questo modo qui: */
process P{
while (true){
P();
printf(“sono p”);
}
}
process Q{
while (true){
printf(“sono q”);
V();
}
}
/* inizializzo entrambi i semafori a 2 */
semaforo v2p(2)
semaforo generale(2)
PPPQQQ // sequenza di avvicendamento dei processi
v2p(2) generale(2) // v2p VS generale
sono p sono p
sono p sono p
sono q sono q
sono q sono p
sono p sono q
sono q sono q
/* con la stessa sequenza di avvicendamento dei processi possiamo notare che l'output generato da entrambi i processi è diverso e quindi i semafori v2p non hanno lo stesso potere espressivo dei semafori generali