Difference between revisions of "ProvaTeorica 2012.05.24"

From Sistemi Operativi
Jump to navigation Jump to search
Line 53: Line 53:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
-TomOgn
 
-TomOgn
 +
 +
 +
<syntaxhighlight lang="C">
 +
monitor santuario{
 +
#define ANDATA 0
 +
#define RITORNO 1
 +
 +
int waiting[2];
 +
int crossing[2];
 +
condition oktoenter[2];
 +
int count; /* persone dentro al santuario */
 +
 +
procedure entry entraponte(int dir){
 +
if (dir == ANDATA){
 +
if (crossing[1-dir] > 0 || crossing[dir] >= MAXPONTE || cout+crossing[dir] >= MAXSANTUARIO){
 +
waiting[dir]++;
 +
oktoenter[dir].wait();
 +
waiting[dir]--;
 +
}
 +
}
 +
else {
 +
if (crossing[1-dir] > 0 || crossing[dir] >= MAXPONTE){
 +
waiting[dir]++;
 +
oktoenter[dir].wait();
 +
waiting[dir]--;
 +
}
 +
}
 +
crossing[dir]++;
 +
if ((crossing[dir]+count < MAXSANTUARIO) && crossing[dir] < MAXPONTE)
 +
oktoenter[dir].signal();
 +
}
 +
 +
procedure entry esciponte(int dir){
 +
crossing[dir]--;
 +
if (dir == ANDATA){
 +
count++;
 +
if (count+crossing[dir] < MAXSANTUARIO) /* voi che siete in attesa andate sul ponte */
 +
oktoenter[dir].signal();
 +
}
 +
else
 +
count--;
 +
 +
if (crossing[dir] == 0)
 +
oktoenter[1-dir].signal();
 +
}
 +
}
 +
</syntaxhighlight>
 +
Gabriele & Giulia (se non va colpa di Gabriele)

Revision as of 15:28, 25 March 2014

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


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();
	}
}

-TomOgn


monitor santuario{
	#define ANDATA 0
	#define RITORNO 1
	
	int waiting[2];
	int crossing[2];
	condition oktoenter[2];
	int count; /* persone dentro al santuario */
	
	procedure entry entraponte(int dir){
		if (dir == ANDATA){
			if (crossing[1-dir] > 0 || crossing[dir] >= MAXPONTE || cout+crossing[dir] >= MAXSANTUARIO){
				waiting[dir]++;
				oktoenter[dir].wait();
				waiting[dir]--;
			}
		}
		else {
			if (crossing[1-dir] > 0 || crossing[dir] >= MAXPONTE){
				waiting[dir]++;
				oktoenter[dir].wait();
				waiting[dir]--;
			}
		}
		crossing[dir]++;
		if ((crossing[dir]+count < MAXSANTUARIO) && crossing[dir] < MAXPONTE)
			oktoenter[dir].signal();
	}
	
	procedure entry esciponte(int dir){
		crossing[dir]--;
		if (dir == ANDATA){
			count++;
			if (count+crossing[dir] < MAXSANTUARIO) /* voi che siete in attesa andate sul ponte */
				oktoenter[dir].signal();
		}
		else
			count--;
		
		if (crossing[dir] == 0)
			oktoenter[1-dir].signal();	
	}
}

Gabriele & Giulia (se non va colpa di Gabriele)