Difference between revisions of "ProvaTeoria 2012.01.12"

From Sistemi Operativi
Jump to navigation Jump to search
Line 33: Line 33:
 
pid index[N] /*index contiene gli id dei vari server*/
 
pid index[N] /*index contiene gli id dei vari server*/
  
struct serverMSG
+
process server[0]
 
{
 
{
pid readers=Queue();  
+
while(1)
message m;
+
{
 +
tmp msg=arecv(*);
 +
for (i=1;i<N;i++)
 +
asend(index[i],msg);
 +
print(msg);
 +
}
 
}
 
}
  
 
+
process server[1...N-1]
/*Database di strutture server msg: contiene una lista di tutti i messaggi arrivati e, per ogni messaggio, quanti server l'hanno letto*/
 
 
 
serverMSG* database=Queue();
 
 
 
 
 
process server[i=0...N-1]()
 
 
{
 
{
message mymsg;
 
struct serverMSG* tmp;
 
 
while(1)
 
while(1)
 
{
 
{
mymsg=arecv(*);
+
tmp msg=arecv(*)
if (mymsg=="###") //è arrivato il messaggio speciale che mi indica di guardare il database
+
if (tmp.sender==index[0])
{
+
print(msg);
while(tmp=read(database)) //La funzione read ritorna in ordine (dalla più vecchia alla più nuova) le strutture presenti nel DB
 
{
 
if (!tmp->readers.found(getpid())) //non ho trovato il mio pid tra la lista dei lettori di quel messaggio
 
{
 
print(tmp->message); //
 
tmp->readers.enqueue(getpid()); //mi aggiungo alla lista dei lettori
 
if (tmp->readers.sizeOf()==N)
 
remove(tmp); //se tutti hanno letto quel messaggio lo rimuovo dalla lista
 
}
 
}
 
}
 
 
else
 
else
{
+
asend(index[0],msg);
database.enqueue(NULL,message); //aggiungo il messaggio settando come coda di lettori NULL
 
foreach(i in index)
 
{
 
send("###",index[i]); // a tutti arriva un messaggio speciale che dice di guardare il DB
 
}
 
 
 
}
 
}
 
}
 
}
 +
 
</syntaxhighlight>
 
</syntaxhighlight>
 
-stefano92
 
-stefano92

Revision as of 10:02, 7 May 2014

TESTO COMPITO

Esercizio 1

monitor seq
{
	condition* c=List() /*lista di condizioni, una per ogni processo arrivato*/
	int* procstack=Stack(); /*stack di processi per l'uscita LIFO*/
	
	procedure entry enter()
	{
		procstack.push(this->p_id);
	}
	
	procedure entry exit()
	{
		if (procstack.Top()!=this->p_id){ /*cioè se il processo non è in cima allo stack*/
			List.insert(this->p_id);
			(List.search(this->p_id)).wait(); /*aggiungo il mio p_id alla lista di condizioni e mi metto in wait*/
			}
		List.remove(this->p_id);
		procstack.Pop();
		List.search(procstack.Top()).signal();
	}
}

NOTA: Con questa soluzione se l'ultimo processo chiama la exit e ci sono altri processi in coda, gli altri processi usciranno prima che l'ultimo esca dallo urgent stack per uscire a sua volta, quindi non credo che rispetti la traccia. Però non ho trovato un'altra soluzione

Esercizio 2

pid index[N] /*index contiene gli id dei vari server*/

process server[0]
{
	while(1)
	{
		tmp msg=arecv(*);
		for (i=1;i<N;i++)
			asend(index[i],msg);
		print(msg);
	}
}

process server[1...N-1]
{
	while(1)
	{
		tmp msg=arecv(*)
		if (tmp.sender==index[0])
			print(msg);
		else
			asend(index[0],msg);
	}
}

-stefano92