Difference between revisions of "ProvaTeoria 2012.01.12"

From Sistemi Operativi
Jump to navigation Jump to search
 
(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*/
  
struct serverMSG
+
process server[0]
 
{
 
{
pid readers=Queue();  
+
while(1)
message m;
+
{
 +
tmp msg=arecv(*);
 +
for (i=1;i<N;i++)
 +
asend(index[i],tmp);
 +
print(tmp);
 +
}
 
}
 
}
  
 
+
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(*);
+
msg tmp =arecv(*)
if (mymsg=="###") //è arrivato il messaggio speciale che mi indica di guardare il database
+
if (tmp.sender==index[0])
{
+
print(tmp);
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],tmp);
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
 +
 +
 +
 +
----
 +
 +
 +
 +
 +
<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.