2017.09.11

From Sistemi Operativi
Jump to navigation Jump to search

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