ProvaTeorica 2012.05.24

From Sistemi Operativi
Revision as of 18:25, 25 March 2014 by Fede (talk | contribs)
Jump to navigation Jump to search

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)



monitor santuario{
	int CurrentDir /* 0 = arriving , 1 = leaving */
	int crossing
	condition oktoenter
	condition oktoleave
	queue enter
	queue ponte
	queue leave
	int fidelis /* fedeli nel tempio */

	procedure entry entraponte(CrossingDir){
		if(CrossingDir != CurrentDir){
			if(CrossingDir == 0){
				enter.enqueue()
				oktoenter.wait()
				enter.dequeue()
			}
			if(CrossingDir == 1){
				leave.enqueue()
				oktoleave.wait()
				leave.dequeue()
			}
		}
		if(CrossingDir == 0){
			if(fidelis == MAXSANTUARIO || crossing == MAXPONTE){
				ponte.enqueue()
				oktoenter.wait()
				ponte.dequeue()
			}
			fidelis++
			crossing++
		}
		if(CrossingDir == 1){
			if(crossing == MAXPONTE){
				ponte.enqueue()
				oktoleave.wait()
				ponte.dequeue()
			}
			fidelis--
			crossing++
		}
	}

	precedure entry esciponte(CrossingDir){
		crossing--
		if(crossing == 0){
			if(CrossingDir == 0){
				if(fidelis < MAXSANTUARIO && !enter.isempty()){
					oktoenter.signal()
				}
				else{
					CurrentDir = 1 - CurrentDir
					oktoleave.signal()
				}
			}
			else{
				CurrentDir = 1 - CurrentDir
				oktoenter.signal()
			}
		}

	}


	santuario{
		crossing = 0
		CurrentDir = 0
		fidelis = 0
	}
}

Fede & Mirko