ProvaTeoria 2011.07.25

From Sistemi Operativi
Revision as of 16:03, 10 March 2014 by Stefano 92 (talk | contribs) (Created page with "Esercizio 2 <syntaxhighlight lang="C"> //siano dati tre processi "stampa" come segue: //stampa(x):(x=A,T,R) process //while (true) { // synchro(x); // print(x); //} //scrivere...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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++;
}