Difference between revisions of "ProvaTeorica 2012.05.24"

From Sistemi Operativi
Jump to navigation Jump to search
Line 11: Line 11:
 
monitor santuario
 
monitor santuario
 
{
 
{
condition okP;   // andare al santuario
+
Go = 0;               // andare al santuario
condition okS;   // tornare indietro
+
Back = 1;             // tornare indietro
int numP = 0;     // numero di persone sul ponte
+
condition ok[2];     // 2 condizioni
int numS = 0;     // numero di persone nel santuario
+
crossing[2] = {0, 0}; // numero di persone sul ponte
int waitingP = 0; // numero di persone che attendono di andare al santuario
+
visiting = 0;         // numero di persone nel santuario
int waitingS = 0; // numero di persone che attendono di tornare indietro
+
waiting[2] = {0, 0}; // numero di persone in attesa
bool toS = true;  // direzione di attraversamento del ponte
 
  
procedure entry entraponte(bool goingBack)
+
procedure entry entraponte(dir)
 
{
 
{
// [Case 1] La persona vuole tornare indietro
+
/* Mi blocco se:
if (goingBack)
+
      - il numero di persone sul ponte ha raggiunto il massimo; oppure
 +
      - la direzione e' il santuario e il numero di visitatori
 +
              (compresi quelli che stanno raggiungendo il santuario) ha raggiunto il massimo; oppure
 +
- qualcuno sta attraversando il ponte in direzione opposta; oppure
 +
- qualcuno sta attendendo di attraversare nel senso opposto */
 +
if (crossing[dir] == MAXPONTE ||
 +
    (dir == Go && visiting + crossing[dir] == MAXSANTUARIO) ||
 +
    crossing[1 - dir] > 0) ||
 +
    waiting[1 - dir] > 0)
 
{
 
{
/* Se - il numero di persone sul ponte ha raggiunto il massimo; oppure
+
waiting[dir]++;
      - qualcuno sta attraversando il ponte in direzione opposta; oppure
+
ok[dir].wait();
      - qualcuno sta attendendo di attraversare nel senso opposto */
+
waiting[dir]--;
if (numP == MAXPONTE || (toS && numP > 0) || waitingP > 0)
 
{
 
// Mi fermo e attendo di essere sbloccato
 
waitingS++;
 
okS.wait();
 
waitingS--;
 
}
 
numP++;
 
numS--;
 
}
 
// [Case 2] La persona vuole andare al santuario
 
else
 
{
 
/* Se - il numero di persone sul ponte ha raggiunto il massimo; oppure
 
      - il numero di persone nel santuario ha raggiunto il massimo; oppure
 
      - qualcuno sta attraversando il ponte in direzione opposta; oppure
 
      - qualcuno sta attendendo di attraversare nel senso opposto */
 
if (numP == MAXPONTE || numP + numS == MAXSANTUARIO || (!toS && numP > 0) || waitingS > 0)
 
{
 
// Mi fermo e attendo di essere sbloccato
 
waitingP++;
 
okP.wait();
 
waitingP--;
 
}
 
numP++;
 
 
}
 
}
 +
crossing[dir]++;
 +
 +
if (dir == Back)
 +
visiting--;
 
}
 
}
  
procedure entry esciponte(bool goingBack)
+
procedure entry esciponte(dir)
 
{
 
{
numP--;
+
crossing[dir]--;
/* Se la persona ha raggiunto il santuario */
+
 
if (!goingBack)
+
if (dir == Go)
numS++;
+
visiting++;
+
/* Se nessuno sta attraversando il ponte */
+
// [Case 1] Nessuno sta attraversando il ponte
if (numP == 0)
+
if (crossing[dir] == 0)
{
+
ok[1 - dir].signal();
// [Case 1] L'ultimo ad attraversare tornava indietro
+
// [Case 2] Qualcuno sta attraversando il ponte
if (goingBack)
+
else
{
+
ok[dir].signal();
/* Se esiste, attivo la persona che per prima si era messa
 
  in attesa per la direzione opposta */
 
if (waitingP > 0)
 
okP.signal();
 
else
 
okS.signal();
 
}
 
// [Case 2] L'ultimo ad attraversare andava al santuario
 
else
 
{
 
/* Se esiste, attivo la persona che per prima si era messa
 
  in attesa per la direzione opposta */
 
if (waitingS > 0)
 
okS.signal();
 
else
 
okP.signal();
 
}
 
}
 
 
}
 
}
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>

Revision as of 20:47, 24 March 2014

http://www.cs.unibo.it/~renzo/so/compiti/2012-05-24.tot.pdf


/*
 * URL: http://www.cs.unibo.it/~renzo/so/compiti/2012-05-24.tot.pdf
 * author: Tommaso Ognibene
*/

monitor santuario
{
	Go = 0;               // andare al santuario
	Back = 1;             // tornare indietro
	condition ok[2];      // 2 condizioni
	crossing[2] = {0, 0}; // numero di persone sul ponte
	visiting = 0;         // numero di persone nel santuario
	waiting[2] = {0, 0};  // numero di persone in attesa

	procedure entry entraponte(dir)
	{
		/* Mi blocco se: 
		      - il numero di persone sul ponte ha raggiunto il massimo; oppure
		      - la direzione e' il santuario e il numero di visitatori 
              (compresi quelli che stanno raggiungendo il santuario) ha raggiunto il massimo; oppure
				- qualcuno sta attraversando il ponte in direzione opposta; oppure
				- qualcuno sta attendendo di attraversare nel senso opposto */	
		if (crossing[dir] == MAXPONTE || 
		    (dir == Go && visiting + crossing[dir] == MAXSANTUARIO) || 
		    crossing[1 - dir] > 0) || 
		    waiting[1 - dir] > 0)
		{
			waiting[dir]++;
			ok[dir].wait();
			waiting[dir]--;
		}
		crossing[dir]++;

		if (dir == Back)
			visiting--;
	}

	procedure entry esciponte(dir)
	{
		crossing[dir]--;

		if (dir == Go)
			visiting++;
		
		// [Case 1] Nessuno sta attraversando il ponte
		if (crossing[dir] == 0)
			ok[1 - dir].signal();
		// [Case 2] Qualcuno sta attraversando il ponte
		else
			ok[dir].signal();
	}
}