Difference between revisions of "ProvaTeoria 2012.01.12"
		
		
		
		
		
		Jump to navigation
		Jump to search
		
				
		
		
	
| Stefano 92 (talk | contribs) | |||
| (10 intermediate revisions by 3 users not shown) | |||
| Line 1: | Line 1: | ||
| =[http://www.cs.unibo.it/~renzo/so/compiti/2012-01-12.tot.pdf TESTO COMPITO]= | =[http://www.cs.unibo.it/~renzo/so/compiti/2012-01-12.tot.pdf TESTO COMPITO]= | ||
| + | |||
| + | == Esercizio 1 == | ||
| + |    P1: 5 6 2 4 5 | ||
| + |    P2: 2 4 2 2 5 | ||
| + |    P3: 4 3 3 2 3 | ||
| + |        C I C I C | ||
| + | |||
| + | P1 ready queue | ||
| + | |||
| + |    SMP|2|2|1|1|1|1|1| | |3|3|3| | | |1|1| | | | | | |1|1|1|1|1|   28 ms | ||
| + |       |3|3|3|3| |2|2| | | | | | | | | | | | | | | | | | | | | | | ||
| + |    RQ |1| | | | | | | | | | | | | | | | | | | | | | | | | | | |  | ||
| + |    I/O| | |2|2|2|2|3|3|3|1|1|1|1|1|1|2|2|3|3|1|1|1|1| | | | | |   | ||
| + | |||
| + | P2 ready queue | ||
| + | |||
| + |    SMP|1|1|1|1|1| | | | | | | | | | | | | | | | | | | | |2|2|2|2|2|   30ms | ||
| + |       |3|3|3|3|2|2| |3|3|3| | | |1|1| | |2|2|3|3|3| |1|1|1|1|1| | | | ||
| + |    RQ |2|2|2|2| | | | | | | | | | | | | | | | | | | | | | | | | | | | ||
| + |    I/O| | | | |3|3|3|1|1|1|1|1|1|2|2|2|2|3|3|1|1|1|1|2|2|2| | | | | | ||
| + | |||
| + | P3 ready queue | ||
| + | |||
| + |    SMP|1|1|1|1|1||2|2|| | | |1|1| |3|3|3| | | |1|1|1|1|1|   26ms | ||
| + |       |2|2|3|3|3|3| | | | | | | | | | |2|2|2|2|2| |3|3|3| | ||
| + |    RQ |3| | | | | | | | | | | | | | | | | | | | | | | | | | ||
| + |    I/O| | |2|2|2|2|1|1|1|1|1|1|3|3|3|2|2|1|1|1|1|3|3| | | | ||
| + | |||
| + | == 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== | ==Esercizio 1== | ||
| + | |||
| + | <syntaxhighlight lang="C"> | ||
| + | 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*/ | ||
| + | 	} | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | GiuliaN. (con le correzioni del professore) | ||
| + | |||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | |||
| <syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
| monitor seq | monitor seq | ||
| Line 33: | Line 121: | ||
| pid index[N] /*index contiene gli id dei vari server*/ | 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] | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | process server[ | ||
| { | { | ||
| − | |||
| − | |||
| 	while(1) | 	while(1) | ||
| 	{ | 	{ | ||
| − | + | 		msg tmp =arecv(*) | |
| − | 		if ( | + | 		if (tmp.sender==index[0]) | 
| − | + | 			print(tmp); | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| 		else | 		else | ||
| − | + | 			asend(index[0],tmp); | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| 	} | 	} | ||
| } | } | ||
| + | |||
| </syntaxhighlight> | </syntaxhighlight> | ||
| -stefano92 | -stefano92 | ||
| + | |||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | <syntaxhighlight lang="C"> | ||
| + | |||
| + | 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 | ||
| + | 	} | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | GiuliaN. | ||
Latest revision as of 17:42, 23 June 2017
TESTO COMPITO
Esercizio 1
  P1: 5 6 2 4 5
  P2: 2 4 2 2 5
  P3: 4 3 3 2 3
      C I C I C
P1 ready queue
  SMP|2|2|1|1|1|1|1| | |3|3|3| | | |1|1| | | | | | |1|1|1|1|1|   28 ms
     |3|3|3|3| |2|2| | | | | | | | | | | | | | | | | | | | | |
  RQ |1| | | | | | | | | | | | | | | | | | | | | | | | | | | | 
  I/O| | |2|2|2|2|3|3|3|1|1|1|1|1|1|2|2|3|3|1|1|1|1| | | | | |  
P2 ready queue
  SMP|1|1|1|1|1| | | | | | | | | | | | | | | | | | | | |2|2|2|2|2|   30ms
     |3|3|3|3|2|2| |3|3|3| | | |1|1| | |2|2|3|3|3| |1|1|1|1|1| | |
  RQ |2|2|2|2| | | | | | | | | | | | | | | | | | | | | | | | | | |
  I/O| | | | |3|3|3|1|1|1|1|1|1|2|2|2|2|3|3|1|1|1|1|2|2|2| | | | |
P3 ready queue
  SMP|1|1|1|1|1||2|2|| | | |1|1| |3|3|3| | | |1|1|1|1|1|   26ms
     |2|2|3|3|3|3| | | | | | | | | | |2|2|2|2|2| |3|3|3|
  RQ |3| | | | | | | | | | | | | | | | | | | | | | | | |
  I/O| | |2|2|2|2|1|1|1|1|1|1|3|3|3|2|2|1|1|1|1|3|3| | |
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.