Difference between revisions of "ProvaTeoria 2012.01.12"
Jump to navigation
Jump to search
Stefano 92 (talk | contribs) |
Stefano 92 (talk | contribs) |
||
Line 35: | Line 35: | ||
struct serverMSG | struct serverMSG | ||
{ | { | ||
− | pid readers=Queue(); | + | pid readers=Queue(); |
message m; | message m; | ||
} | } | ||
− | serverMSG* database=Queue(); | + | /*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]() | process server[i=0...N-1]() | ||
Line 49: | Line 52: | ||
{ | { | ||
mymsg=arecv(*); | mymsg=arecv(*); | ||
− | if (mymsg=="###") | + | if (mymsg=="###") //è arrivato il messaggio speciale che mi indica di guardare il database |
{ | { | ||
− | while(tmp=read(database)) | + | 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())) | + | if (!tmp->readers.found(getpid())) //non ho trovato il mio pid tra la lista dei lettori di quel messaggio |
{ | { | ||
− | print(tmp->message); | + | print(tmp->message); // |
− | tmp->readers.enqueue(getpid()); | + | tmp->readers.enqueue(getpid()); //mi aggiungo alla lista dei lettori |
if (tmp->readers.sizeOf()==N) | if (tmp->readers.sizeOf()==N) | ||
− | remove(tmp); | + | remove(tmp); //se tutti hanno letto quel messaggio lo rimuovo dalla lista |
} | } | ||
} | } | ||
Line 64: | Line 67: | ||
else | else | ||
{ | { | ||
− | database.enqueue(NULL,message); | + | database.enqueue(NULL,message); //aggiungo il messaggio settando come coda di lettori NULL |
foreach(i in index) | foreach(i in index) | ||
{ | { | ||
− | send("###",index[i]); | + | send("###",index[i]); // a tutti arriva un messaggio speciale che dice di guardare il DB |
} | } | ||
Revision as of 16:30, 4 May 2014
TESTO COMPITO
Esercizio 1
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*/
struct serverMSG
{
pid readers=Queue();
message m;
}
/*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)
{
mymsg=arecv(*);
if (mymsg=="###") //è arrivato il messaggio speciale che mi indica di guardare il database
{
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
{
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
}
}
}
-stefano92