TU Wien:Betriebssysteme VO (Puschner)/Prüfung 2015-06-03 Synchronisation mit Semaphoren Lösungsvorschlag

Aus VoWi
Zur Navigation springen Zur Suche springen
  1. Lösungsvorschlag für das Beispiel "Synchronisation mit Semaphoren" aus der Prüfung 20150603 (http://ti.tuwien.ac.at/cps/teaching/courses/osvo/alte-testangaben/pruefung20150603.pdf/view)
class Auto_AG:
	def __init__(self):
		A();
		B();
		C();
		D();
		E();
		F();
		G();

	def A(self):
		P(AG_B); # kann nur in B einfahrn wenn kein anderes AG_Auto auf B ist
		P(Z_B); # kann nur in B einfahrn wenn kein zug auf B ist

	def B(self):

	def C(self):
		V(Z_B); # zuerst B für Züge freigeben (Pirorisierung von Zug)
		V(AG_B); # dann B für AG_Autos freigeben
		P(AG_D); # kann nur in D einfahrn wenn kein anderes AG_Auto auf D ist

	def D(self):
		P(A_E); # kann nur in E einfahren wenn kein aderes Auto auf E ist
		P(AG_F); #kann nur in E einfahren wenn kein AG_Auto auf F ist
		P(Z_E); # kann nur in E Einfahren wenn kein Zug auf E ist

	def E(self):

	def F(self):
		V(Z_E); # zuerst E für Zuge freigen => priorisierung von Zügen
		V(A_E); # streckenabschnitt E für alle Autos freigeben

	def G(self):
		V(AG_F); # F für AG_Autos freigeben

class Auto_GA:
	def __init__(self):
		G();
		F();
		E();
		D();
		C();
		B();
		A();

	def G(self):
		P(GA_F); # kann nur in F einfahren wenn keine GA_Autos auf F sind

	def F(self):
		P(A_E); # kann nur in E einfahren wenn keine Autos auf E sind
		P(GA_D); #kann nur in E einfahren wenn keine GA_Autos auf D sind
		P(Z_E); # kann nur in E einfahren wenn kein Zug auf E ist 

	def E(self):

	def D(self):
		V(Z_E); # E für zug freigeben
		V(A_E); # E für alle Autos freigeben

	def C(self):
		V(GA_D); # D für GA_Autos freigeben
		P(GA_B); # kann nur in B einfahren wenn kein anderes GA_Auto auf B ist
		P(Z_B); # kann nur in B einfahren wenn kein Zug auf B ist

	def B(self):

	def A(self):
		V(Z_B); # B für zug freigeben
		V(GA_B); # B für GA_AUtos freigeben

class Zug_B:
	def __init__(self):
		Anfahrt();
		Kreuzung();
		Weiterfahrt();

	def Anfahrt(self):
		P(Z_B); # kann nur in die Kreuzung einfahren wenn die Kreuzung frei ist
	def Kreuzung(self):

	def Weiterfahrt(self):
		V(Z_B); # gib B wieder frei

class Zug_E:
	def __init__(self):
		Anfahrt();
			P(Z_E); # kann nur in die Kreuzung einfahren wenn die Kreuzung frei ist
		Kreuzung();

		Weiterfahrt();
			V(Z_E); # gibt die Kreuzung wieder frei

	def Anfahrt(self):
	def Kreuzung(self):
	def Weiterfahrt(self):

def main():
	init(AG_B,1);
	init(AG_D,1);
	init(AG_F,1);
	init(GA_F,1);
	init(GA_D,1);
	init(GA_B,1);
	init(A_E,1);
	init(Z_B,1);
	init(Z_E,1);

if __name__ == "__main__": main()

2. Lösungsvorschlag

init() {
 init(sem_b, 1);
 init(sem_b_autos, 1);
 init(sem_b_zug, 1);
 init(sem_b_x, 1);
 autos_in_b = 1;

 init(sem_c, k);

 init(sem_e, 1);
 init(sem_e_autos, 1);
}

function auto_ag() {
 // A
 A();

 P(sem_b_autos);
 P(sem_b_zug);
 P(sem_b_x);
 autos_in_b = autos_in_b + 1;
 if (autos_in_b == 1) {
  P(sem_b);
 }
 V(sem_b_x);
 V(sem_b_zug);
 V(sem_b_autos);
 // B
 B();
 P(sem_b_x);
 autos_in_b = autos_in_b - 1;
 if (autos_in_b == 0) {
  V(sem_b);
 }
 V(sem_b_x);

 P(sem_c);
 // C
 C();
 V(sem_c);
 
 // D
 D();

 P(sem_e_autos);
 P(sem_e);
 // E
 E();
 V(sem_e);
 V(sem_e_autos);

 // F
 F();

 // G
 G();
}

function auto_ga() {
 // G
 G();

 // F
 F();

 P(sem_e_autos);
 P(sem_e);
 // E
 E();
 V(sem_e);
 V(sem_e_autos);

 // D
 D();

 P(sem_c);
 // C
 C();
 V(sem_c);

 P(sem_b_autos);
 P(sem_b_zug);
 P(sem_b_x);
 autos_in_b = autos_in_b + 1;
 if (autos_in_b == 1) {
  P(sem_b);
 }
 V(sem_b_x);
 V(sem_b_zug);
 V(sem_b_autos);
 // B
 B();
 P(sem_b_x);
 autos_in_b = autos_in_b - 1;
 if (autos_in_b == 0) {
  V(sem_b);
 }
 V(sem_b_x);

 // A
 A();
}

function zug_b() {
 Anfahrt();

 P(sem_b_zug);
 P(sem_b);
 Kreuzung();
 V(sem_b);
 V(sem_b_zug);

 Weiterfahrt();
}

function zug_e() {
 Anfahrt();

 P(sem_e);
 Kreuzung();
 V(sem_e);
 
 Weiterfahrt();
}