ProvaTeoria 2012.01.12

From Sistemi Operativi
Jump to navigation Jump to search

TESTO COMPITO

Esercizio 2

MIN

0 1 2 3 4 5 6 0 1 2 3 4 5 0 1 2 3 4 6 0 1 2

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  
   2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2  
     3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 
       4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 
         5 6 6 6 6 6 6 5 5 5 5 5 5 6 6 6 6 
           ^           ^           ^         3 PF

FIFO

0 1 2 3 4 5 6 0 1 2 3 4 5 0 1 2 3 4 6 0 1 2

0 0 0 0 0 0 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5

 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 6 6 6 6 
   2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 0 0 0
     3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 1 1
       4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 2
         5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 
           ^ ^ ^ ^ ^               ^ ^ ^ ^    9 PF



Esercizio 1

struct proc{
	int id;
	condition oktoexit;
};

monitor seq{
	stack of struct proc inside; /*pila di proc*/
	
	procedure entry enter(){
		this=malloc(sizeof(struct proc)); //or this=new(struct proc);
		this->id = getpid();
		inside.push(this);
	}
	
	procedure entry exit(){
		struct proc *mine = inside.search(getpid()); //cerca il mio elemento nella pila
		if(inside.first()!= mine) /*first restituisce il primo elemento in cima alla pila*/
			mine->oktoexit.wait(); /*se l'elemento corrente non è il primo nella pila, allora deve aspettare*/
		inside.pop(); /*rimuovo l'elemento corrente dalla pila*/
		free(mine); //butto via il risultato perché è certamente == mine
		next=inside.first();
		inside.first()->oktoexit.signal(); /*risvegliamo il primo elemento sulla pila*/
	}
}

GiuliaN. (con le correzioni del professore)




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],tmp);
		print(tmp);
	}
}

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

-stefano92





process server[0]{ //il primo processo server, che gestisce tutti gli altri
	while(1){
		(sender, m) = areceive(*);
		//chiunque mi abbia spedito il msg io lo stampo
		printf(m);
		//lo mando a tutti gli altri server (me escluso) in modo che lo stampino
		for(i=1; i<N; i++)
			asend((server0, m), server[i]);
	}
}

process server[i]{ //per i che va da 1 a N, dove lo 0-esimo è il primo server
	while(1){
		(sender, m) = areceive(*);
		if(sender == server0)
			printf(m);
		else //messaggio dal client
			asend(m, server0); //lo mando al server0, senza prima stamparlo
	}
}

GiuliaN.