ProvaTeoria 2011.01.17

From Sistemi Operativi
Revision as of 10:39, 30 April 2014 by Stefano 92 (talk | contribs)
Jump to navigation Jump to search

TESTO COMPITO

Esercizio 1

/*
Esercizio 1: Scrivere un monitor reqq che gestisca una coda di richieste.
I richiedenti chiamano la funzione che ha la seguente signature:
answer_t reqq.query(request_t request);
Query deve fermare il processo richiedente fino a completamento della richiesta da parte di un gestore. Il valore di ritorno 
e' la risposta del gestore.
Ci sono N gestori che si comportano come segue:
multiq_handler: process[i, i=0,..,N-1] {
	request_t req;
	int type;
	while (1) {
		 req=reqq.getquery(i);
		 reqq.reply(i,handle(req));
 	}
}
Le richieste vengono assegnate ai gestori disponibili o accodate se sono tutti impegnati. Quando un gestore termina la 
gestione (funzione handle, che non implementare!) invia il risultato tramite la reply. Il valore passato alla reply deve 
essere restituito al richiedente come valore di ritorno della funzione query. Se non vi sono richieste disponibili i gestori si 
fermano attendendo nuove richieste.
*/


/*La mia soluzione si basa su una struttura reqEntry contenente un campo per la domanda, uno per la risposta, una condizione oktoexit e un intero per il gestore.
Quando arriva un richiedente inserisce una struttura con una domanda e con i campi risposta e gestore vuoti.
Quando un gestore si occupa di una domanda setta l'opportuno campo gestore al suo indice e, al termine della routine handle(), inserisce la sua risposta nell'opportuno
campo della struct risvegliando il richiedente*/

struct reqEntry
{
	request_t req;
	condition oktoexit;
	answer_t reply=NULL;
	int handler=VOID; //VOID è un valore speciale avente valore diverso dagli indici dei gestori
}
monitor reqq
{
	reqEntry* rq=Queue(); /*coda di reqEntry*/
	condition oktohandle; /*per i gestori*/
	answer_t procedure entry query(request_t request)
	{
		rq.insert(request); 
		rp=rq.searchByReq(request);
		oktohandle.signal(); /*cerco se esiste un gestore in attesa per la mia richiesta*/
		if (rp->reply==NULL) /*la richiesta non ha avuto risposta*/
			rp->oktoexit.wait();
		risp=rp->reply; 
		remove(rp); /*recupero la risposta e rimuovo la struct dalla coda*/
		return risp;	
	}
	request_t procedure entry  getquery(int index)
	{
		if isEmptyFree(rq) /*isEmptyFree ritorna 1 se non ci sono struct libere (cioè con handler VOID) nella coda di reqEntry*/
		{
			oktohandle.wait();
		}
		rp=rq.searchFree(); /*restituisce un elemento della coda di reqEntry avente handler VOID*/
		rp->handler=index; 
		return rp;
	}
	procedure entry reply(int index, answer_t rep)
	{
		rp=rq.searchByHandler(index); /*cerca nella lista la struct avente handler uguale al mio indice*/
		rp->reply=rep;
		rp->oktoexit.signal();
	}
}

-stefano92