TU Wien:Betriebssysteme VO (Puschner)/Prüfung 2015-06-03 Synchronisation mit Semaphoren Lösungsvorschlag
Zur Navigation springen
Zur Suche springen
- 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();
}