Difference between revisions of "ProvaTeoria 2012.01.12"
Jump to navigation
Jump to search
Stefano 92 (talk | contribs) (Created page with "=[http://www.cs.unibo.it/~renzo/so/compiti/2012-01-12.tot.pdf TESTO COMPITO]= ==Esercizio 1== <syntaxhighlight lang="C"> monitor seq { condition* c=List() int* procstack=St...") |
|||
(14 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 | ||
{ | { | ||
− | condition* c=List() | + | condition* c=List() /*lista di condizioni, una per ogni processo arrivato*/ |
− | int* procstack=Stack(); | + | int* procstack=Stack(); /*stack di processi per l'uscita LIFO*/ |
procedure entry enter() | procedure entry enter() | ||
Line 15: | Line 103: | ||
procedure entry exit() | procedure entry exit() | ||
{ | { | ||
− | if (procstack.Top()!=this->p_id){ | + | if (procstack.Top()!=this->p_id){ /*cioè se il processo non è in cima allo stack*/ |
List.insert(this->p_id); | List.insert(this->p_id); | ||
− | (List.search(this->p_id)).wait(); | + | (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); | List.remove(this->p_id); | ||
Line 27: | Line 115: | ||
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. | 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 | + | Però non ho trovato un'altra soluzione |
+ | |||
+ | ==Esercizio 2== | ||
+ | <syntaxhighlight lang="C"> | ||
+ | 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); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </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.