Difference between revisions of "ProvaTeorica 2013.05.30"

From Sistemi Operativi
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