Difference between revisions of "ProvaTeoria 2011.07.25"

From Sistemi Operativi
Jump to navigation Jump to search
 
(One intermediate revision by the same user not shown)
Line 58: Line 58:
  
 
==Esercizio 3==
 
==Esercizio 3==
 +
<syntaxhighlight lang="C">
 +
 
/*
 
/*
 
Esercizio 3: Dato un servizio di message passing asincrono (NON completamente asincrono) e senza fare uso di un  
 
Esercizio 3: Dato un servizio di message passing asincrono (NON completamente asincrono) e senza fare uso di un  
Line 65: Line 67:
 
messaggi in attesa di essere ricevuti.
 
messaggi in attesa di essere ricevuti.
 
*/
 
*/
<syntaxhighlight lang="C">
 
 
  
 
pid* database=Stack();
 
pid* database=Stack();
Line 86: Line 86:
 
     pid_t replier;
 
     pid_t replier;
 
     asend("BOT",getpid());
 
     asend("BOT",getpid());
while(tmp=arecv(*)!=BOT)
+
    while(tmp=arecv(*)!=BOT)
{
+
    {
database.push(tmp.sender);
+
database.push(tmp.sender);
}
+
    }
replier=database.pop(sender);
+
    replier=database.pop(sender);
if (replier==NULL)
+
    if (replier==NULL)
 
{
 
{
tmp=arecv(sender);
+
    tmp=arecv(sender);
replier=tmp.sender;
+
    replier=tmp.sender;
 
}
 
}
asend(replier,"OK");
+
    asend(replier,"OK");
tmp=arecv(replier);
+
    tmp=arecv(replier);
asend(replier,"END");
+
    asend(replier,"END");
return tmp;
+
    return tmp;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
-stefano92
 
-stefano92

Latest revision as of 09:55, 7 May 2014

Esercizio 2

//siano dati tre processi "stampa" come segue:
//stampa(x):(x=A,T,R) process
//while (true) {
// synchro(x);
// print(x);
//}
//scrivere la fuzione synchro() facendo uso di semafori che consenta di avere in output una sequenza infinita
//di TARATATA (i.e. TARATATATARATATATARATATATARATATATARATATA......)


/*La soluzione prevede l'utilizzo di 3 semafori, uno per ogni lettera (T,A,R). E' presente anche una variabile buflen contenente
 la lunghezza della stringa stampata fino ad ora.
   L'idea si basa sull'utilizzo di una funzione mutex_print() che, a seconda dell'output generato, libera l'opportuno semaforo.
 Le risorse dei semafori vengono poi richieste dai processi.*/


/*definizione variabili di supporto e #define*/

#DEFINE T 0
#DEFINE R 1
#DEFINE A 2
int buflen=0;

/*definizione dei semafori*/
int sem[3];
sem[T]=1;
sem[R]=0
sem[A]=0

/*funzione di supporto: controlla se è arrivato il momento di stampare una R*/
int checkR(int x)
{
  if((x-2)%8==0)
     return 1;
  else return 0;
}

void mutex_print()
{
if (buflen==0) return;
else if (buflen%2!=0)
  v(sem[A]);
else if (checkR(buflen))
  v(sem[R]);
else v(sem[T]);
return;
}
void synchro(int x)
{
mutex();
p(sem[x]);
buflen++;
}

Esercizio 3

/*
Esercizio 3: Dato un servizio di message passing asincrono (NON completamente asincrono) e senza fare uso di un 
server implementare un servizio di message passing sincrono LIFO. (cioe' dati asend/arecv, implementare lssend 
lsrecv)
I messaggi possono essere di grandi dimensioni, si chiede quindi che l'implementazione non crei una coda con tutti i 
messaggi in attesa di essere ricevuti.
*/

pid* database=Stack();

void lssend(int dest,message m)
{
	message tmp;
	asend(dest,"#");
	tmp=arecv(dest);
	asend(dest,msg)
	arecv(dest);
	return;
}
	
		
message lsrecv(pid sender)
{
    message tmp;
    pid_t replier;
    asend("BOT",getpid());
    while(tmp=arecv(*)!=BOT)
    {
	database.push(tmp.sender);
    }
    replier=database.pop(sender);
    if (replier==NULL)
	{
	    tmp=arecv(sender);
	    replier=tmp.sender;
	}
    asend(replier,"OK");
    tmp=arecv(replier);
    asend(replier,"END");
    return tmp;
}

-stefano92