Difference between revisions of "ProvaTeorica 2012.05.24"

From Sistemi Operativi
Jump to navigation Jump to search
Line 1: Line 1:
 
<h1>http://www.cs.unibo.it/~renzo/so/compiti/2012-05-24.tot.pdf</h1>
 
<h1>http://www.cs.unibo.it/~renzo/so/compiti/2012-05-24.tot.pdf</h1>
  
[[File:Ex2012-05-24-c1.jpeg]]
+
 
 +
 
 +
<syntaxhighlight lang="C">
 +
/*
 +
* URL: http://www.cs.unibo.it/~renzo/so/compiti/2012-05-24.tot.pdf
 +
* author: Tommaso Ognibene
 +
*/
 +
 
 +
monitor santuario
 +
{
 +
condition okP;    // andare al santuario
 +
condition okS;    // tornare indietro
 +
int numP = 0;    // numero di persone sul ponte
 +
int numS = 0;    // numero di persone nel santuario
 +
int waitingP = 0; // numero di persone che attendono di andare al santuario
 +
int waitingS = 0; // numero di persone che attendono di tornare indietro
 +
bool toS = true;  // direzione di attraversamento del ponte
 +
 
 +
procedure entry entraponte(bool fromS)
 +
{
 +
// [Case 1] la persona parte dal santuario
 +
if (fromS)
 +
{
 +
/* Se - il numero di persone sul ponte 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 || (toS && numP > 0) || waitingP > 0)
 +
{
 +
// Mi fermo e attendo di essere sbloccato
 +
waitingS++;
 +
okS.wait();
 +
waitingS--;
 +
}
 +
numP++;
 +
numS--;
 +
}
 +
// [Case 2] la persona vuole raggiungere il 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++;
 +
}
 +
}
 +
 
 +
procedure entry esciponte(bool fromS)
 +
{
 +
numP--;
 +
/* Se nessuno sta attraversando il ponte */
 +
if (numP == 0)
 +
{
 +
// [Case 1] l'ultimo ad attraversare tornava indietro
 +
if (fromS)
 +
/* Attivo la persona che per prima si era messa
 +
  in attesa per raggiungere il santuario*/
 +
okP.signal();
 +
// [Case 2] l'ultimo ad attraversare andava al santuario
 +
else
 +
{
 +
/* Aggiorno il numero di persone nel santuario */
 +
numS++;
 +
/* Attivo la persona che per prima si era messa
 +
  in attesa per tornare indietro */
 +
okS.signal();
 +
}
 +
}
 +
}
 +
}
 +
</syntaxhighlight>

Revision as of 08:49, 17 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
{
	condition okP;    // andare al santuario
	condition okS;    // tornare indietro
	int numP = 0;     // numero di persone sul ponte
	int numS = 0;     // numero di persone nel santuario
	int waitingP = 0; // numero di persone che attendono di andare al santuario
	int waitingS = 0; // numero di persone che attendono di tornare indietro
	bool toS = true;  // direzione di attraversamento del ponte

	procedure entry entraponte(bool fromS)
	{
		// [Case 1] la persona parte dal santuario
		if (fromS)
		{
			/* Se - il numero di persone sul ponte 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 || (toS && numP > 0) || waitingP > 0)
			{
				// Mi fermo e attendo di essere sbloccato
				waitingS++;
				okS.wait();
				waitingS--;
			}
			numP++;
			numS--;
		}
		// [Case 2] la persona vuole raggiungere il 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++;
		}
	}

	procedure entry esciponte(bool fromS)
	{
		numP--;
		/* Se nessuno sta attraversando il ponte */
		if (numP == 0)
		{
			// [Case 1] l'ultimo ad attraversare tornava indietro
			if (fromS)
				/* Attivo la persona che per prima si era messa
				   in attesa per raggiungere il santuario*/
				okP.signal();
			// [Case 2] l'ultimo ad attraversare andava al santuario
			else
			{
				/* Aggiorno il numero di persone nel santuario */
				numS++;
				/* Attivo la persona che per prima si era messa 
				   in attesa per tornare indietro */
				okS.signal();
			}
		}
	}
}