Difference between revisions of "ProvaTeoria 2012.01.12"
		
		
		
		
		
		Jump to navigation
		Jump to search
		
				
		
		
	
| Stefano 92 (talk | contribs) | Stefano 92 (talk | contribs)  | ||
| Line 35: | Line 35: | ||
| struct serverMSG | struct serverMSG | ||
| { | { | ||
| − | 	pid readers=Queue(); | + | 	pid readers=Queue();   | 
| 	message m; | 	message m; | ||
| } | } | ||
| − | serverMSG* database=Queue(); | + | /*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]() | process server[i=0...N-1]() | ||
| Line 49: | Line 52: | ||
| 	{ | 	{ | ||
| 		mymsg=arecv(*); | 		mymsg=arecv(*); | ||
| − | 		if (mymsg=="###") | + | 		if (mymsg=="###") //è arrivato il messaggio speciale che mi indica di guardare il database | 
| 		{ | 		{ | ||
| − | 			while(tmp=read(database)) | + | 			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())) | + | 				if (!tmp->readers.found(getpid())) //non ho trovato il mio pid tra la lista dei lettori di quel messaggio | 
| 				{ | 				{ | ||
| − | 					print(tmp->message); | + | 					print(tmp->message); // | 
| − | 					tmp->readers.enqueue(getpid()); | + | 					tmp->readers.enqueue(getpid()); //mi aggiungo alla lista dei lettori | 
| 					if (tmp->readers.sizeOf()==N) | 					if (tmp->readers.sizeOf()==N) | ||
| − | 						remove(tmp);	 | + | 						remove(tmp);			//se tutti hanno letto quel messaggio lo rimuovo dalla lista		 | 
| 				} | 				} | ||
| 			} | 			} | ||
| Line 64: | Line 67: | ||
| 		else | 		else | ||
| 		{ | 		{ | ||
| − | 			database.enqueue(NULL,message); | + | 			database.enqueue(NULL,message); //aggiungo il messaggio settando come coda di lettori NULL | 
| 			foreach(i in index) | 			foreach(i in index) | ||
| 			{ | 			{ | ||
| − | 				send("###",index[i]); | + | 				send("###",index[i]); // a tutti arriva un messaggio speciale che dice di guardare il DB | 
| 			} | 			} | ||
Revision as of 16:30, 4 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*/
struct serverMSG
{
	pid readers=Queue(); 
	message m;
}
/*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)
	{
		mymsg=arecv(*);
		if (mymsg=="###") //è arrivato il messaggio speciale che mi indica di guardare il database
		{
			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
		{
			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
			}
		
	}
}
-stefano92