Difference between revisions of "ProvaTeorica 2014.01.22"

From Sistemi Operativi
Jump to navigation Jump to search
Line 81: Line 81:
 
------
 
------
  
[[File:Ex2014-01-22-c1.jpeg]]
+
<syntaxhighlight lang="C">
 +
/*
 +
* URL: http://www.cs.unibo.it/~renzo/so/compiti/2014.01.22.tot.pdf
 +
* author: Tommaso Ognibene
 +
*/
 +
 
 +
monitor bridge
 +
{
 +
condition okE;    // attraversare in direzione Est
 +
condition okW;    // attraversare in direzione Ovest
 +
int n = 0;        // numero di veicoli sul ponte
 +
int waitingE = 0; // numero di veicoli che attendono di attraversare in direzione Est
 +
int waitingW = 0; // numero di veicoli che attendono di attraversare in direzione Ovest
 +
bool toE = true;  // direzione di attraversamento
 +
 
 +
procedure entry enter(Vehicle vehicle)
 +
{
 +
// [Case 1] il veicolo vuole attraversare in direzione Est
 +
if (vehicle.From == 'E')
 +
{
 +
/* Se - il numero di veicoli sul ponte ha raggiunto il massimo; oppure
 +
      - qualcuno sta attraversando in direzione opposta; oppure
 +
      - qualcuno sta attendendo di attraversare in direzione opposta */
 +
if (n == N || (!toE && n > 0) || (toE && waitingW > 0))
 +
{
 +
// Mi fermo e attendo di essere sbloccato
 +
waitingE++;
 +
okE.wait();
 +
waitingE--;
 +
}
 +
toE = true;
 +
n++;
 +
/* Sblocco eventuali altri veicoli in attesa per la stessa direzione in modo
 +
* da sfruttare la portata del ponte */
 +
okE.signal();
 +
}
 +
// [Case 2] il veicolo vuole attraversare in direzione Ovest
 +
else
 +
{
 +
/* Se - il numero di veicoli sul ponte ha raggiunto il massimo; oppure
 +
      - qualcuno sta attraversando in direzione opposta; oppure
 +
      - qualcuno sta attendendo di attraversare in direzione opposta */
 +
if (n == N || (toE && n > 0) || (!toE && waitingE > 0))
 +
{
 +
// Mi fermo e attendo di essere sbloccato
 +
waitingW++;
 +
okW.wait();
 +
waitingW--;
 +
}
 +
toE = false;
 +
n++;
 +
/* Sblocco eventuali altri veicoli in attesa per la stessa direzione in modo
 +
* da sfruttare la portata del ponte */
 +
okW.signal();
 +
}
 +
}
 +
 
 +
procedure entry exit(Vehicle vehicle)
 +
{
 +
n--;
 +
/* Se nessuno sta attraversando il ponte */
 +
if (n == 0)
 +
{
 +
// [Case 1] l'ultimo ad attraversare andava in direzione Est
 +
if (vehicle.From == 'E')
 +
/* Attivo il veicolo che per primo si era messo
 +
  in attesa per attraversare in direzione Ovest */
 +
okW.signal();
 +
// [Case 2] l'ultimo ad attraversare andava in direzione Ovest
 +
else
 +
/* Attivo il veicolo che per primo si era messo
 +
  in attesa per attraversare in direzione Est */
 +
okE.signal();
 +
}
 +
}
 +
}
 +
</syntaxhighlight>

Revision as of 08:47, 17 March 2014


URL: http://www.cs.unibo.it/~renzo/so/compiti/2014.01.22.tot.pdf

@author: Alessandro


monitor bridge {
condition oktomove;	/*si muove solo se il ponte è libero o non ci sono auto che vengono nel senso opposto */
int turn=0;		/*indica il senso delle auto */
int est=0,ovest=0;      /*contatori delle auto da est e da ovest */
Queue q;		/*coda delle senso delle macchine in attesa */

procedure entry enter (char EoW)
{
	if(EoW == "E")		/* viene da est */
	{
		if(turn == 2 || est >=N || !empty(q))  
		{
			q=equeue("E");		/*inserisco nella coda dei sensi*/	
			oktomove.wait();   	/*aspetta*/
									
		}
	turn = 1;	/*impongo il senso delle auto in circolo nel ponte */
	est++;
	}
	else		/* viene da ovest */
	{
		if(turn ==1 || ovest >=N || !empty(q))
		{
		        q=equeue("O");		/*inserisco nella coda dei sensi*/
			oktomove.wait();	/*aspetta*/
									
		}
	turn = 2;	/*impongo il senso delle auto in circolo nel ponte */
	ovest++;
	}
}

procedure entry exit(char EoW)
{
	char r;
	if(EoW == "O")
	{
	est--;
	r=tail(q);
		if(est == 0 || r == "E")
		{
		est--;
			if(est == 0)	/*nessuna auto in transito nel ponte */
			{
			turn = 0;	/*avanti un altro */
			}
			if(!empty(q))
			{
			q.dequeue();
			oktomove.signal();	/*segnale*/
			}
                }
	else
	{
	ovest--;
        r=tail(q);
		if(ovest == 0 || r == "O")	 /*nessuna auto in transito nel ponte */
		{
		turn = 0;	/*avanti un altro */
		}
		if(!empty(q))
		{
		q.dequeue();		
		oktomove.signal();	/*segnale*/
	        }
        }
}

}

/*
 * URL: http://www.cs.unibo.it/~renzo/so/compiti/2014.01.22.tot.pdf
 * author: Tommaso Ognibene
*/

monitor bridge
{
	condition okE;    // attraversare in direzione Est
	condition okW;    // attraversare in direzione Ovest
	int n = 0;        // numero di veicoli sul ponte
	int waitingE = 0; // numero di veicoli che attendono di attraversare in direzione Est
	int waitingW = 0; // numero di veicoli che attendono di attraversare in direzione Ovest
	bool toE = true;  // direzione di attraversamento

	procedure entry enter(Vehicle vehicle)
	{
		// [Case 1] il veicolo vuole attraversare in direzione Est
		if (vehicle.From == 'E')
		{
			/* Se - il numero di veicoli sul ponte ha raggiunto il massimo; oppure
			      - qualcuno sta attraversando in direzione opposta; oppure
			      - qualcuno sta attendendo di attraversare in direzione opposta */
			if (n == N || (!toE && n > 0) || (toE && waitingW > 0))
			{
				// Mi fermo e attendo di essere sbloccato
				waitingE++;
				okE.wait();
				waitingE--;
			}
			toE = true;
			n++;
			/* Sblocco eventuali altri veicoli in attesa per la stessa direzione in modo
			 * da sfruttare la portata del ponte */
			okE.signal();
		}
		// [Case 2] il veicolo vuole attraversare in direzione Ovest
		else
		{
			/* Se - il numero di veicoli sul ponte ha raggiunto il massimo; oppure
			      - qualcuno sta attraversando in direzione opposta; oppure
			      - qualcuno sta attendendo di attraversare in direzione opposta */
			if (n == N || (toE && n > 0) || (!toE && waitingE > 0))
			{
				// Mi fermo e attendo di essere sbloccato
				waitingW++;
				okW.wait();
				waitingW--;
			}
			toE = false;
			n++;
			/* Sblocco eventuali altri veicoli in attesa per la stessa direzione in modo
			 * da sfruttare la portata del ponte */
			okW.signal();
		}
	}

	procedure entry exit(Vehicle vehicle)
	{
		n--;
		/* Se nessuno sta attraversando il ponte */
		if (n == 0)
		{
			// [Case 1] l'ultimo ad attraversare andava in direzione Est
			if (vehicle.From == 'E')
				/* Attivo il veicolo che per primo si era messo
				   in attesa per attraversare in direzione Ovest */
				okW.signal();
			// [Case 2] l'ultimo ad attraversare andava in direzione Ovest
			else
				/* Attivo il veicolo che per primo si era messo
				   in attesa per attraversare in direzione Est */
				okE.signal();
		}
	}
}