Difference between revisions of "2017.09.11"

From Sistemi Operativi
Jump to navigation Jump to search
(Created page with "Pdf completo qui: [http://www.cs.unibo.it/~renzo/so/compiti/2017.09.11.tot.pdf 2017.09.11.tot.pdf] =Esercizio c1= <syntaxhighlight lang=c> Un semaforo intelligente controlla ...")
 
(No difference)

Latest revision as of 17:51, 9 May 2018

Pdf completo qui: 2017.09.11.tot.pdf

Esercizio c1

Un semaforo intelligente controlla un incrocio al quale si può accedere da 4 direzioni N, E, S, W. 
Un solo veicolo alla volta deve occupare larea dellincrocio. 
Se sono presenti veicoli da tutte le direzioni, il semaforo fa avanzare ciclicamente un veicolo da ogni direzione (NESWNESWNESW). 
Se nessun veicolo è in attesa da una direzione, il turno viene saltato.
Quella che segue è la porzione di di programma eseguita dai veicoli per passare attraverso lincrocio:

 	crossing.enter(direction)
 	critical section
 	crossing.exit(direction)

Nonostante sia un semaforo, questo esercizio deve venir risolto coi monitor.

Soluzione proposta 1

monitor crossing{
	
	enum direction = {N, E, S, W};
	condition ok2cross[4];
	boolean busy;
	int waiting[4];

	procedure_entry void enter(enum direction d){
		waiting[d]++;
		if(waiting[d] > 1) ok2cross[d].wait();
		busy = true;
		waiting[d]--;

	}

	procedure_entry void exit(enum direction d){
		busy = false;
		for(int i = 1; i < 5; i++){ 
			if(waiting[(d + i) % 4]) ok2cross[(d + i) % 4].signal();
		}
	}

	crossing(){
		for(int i = 0; i < 4; i++) waiting[i] = 0;
		busy = false;
	}
}