Difference between revisions of "ProvaTeoria 2012.01.12"
Jump to navigation
Jump to search
Line 88: | Line 88: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
-stefano92 | -stefano92 | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | <syntaxhighlight lang="C"> | ||
+ | |||
+ | process server0{ //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. |
Revision as of 10:38, 6 July 2014
TESTO COMPITO
Esercizio 1
struct proc{
int id;
condition oktoexit;
};
monitor seq{
stack of struct proc inside; /*pila di proc*/
procedure entry enter(){
inside.push();
}
procedure entry exit(){
if(inside.first()!=inside) /*first restituisce il primo elemento in cima alla pila*/
inside.oktoexit.wait(); /*se l'elemento corrente non è il primo nella pila, allora deve aspettare*/
inside.pop(); /*rimuovo l'elemento corrente dalla pila*/
inside.first().oktoexit.signal(); /*risvegliamo il primo elemento sulla pila*/
}
}
GiuliaN.
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 server0{ //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.