TU Wien:Betriebssysteme VO (Puschner)/Prüfung 2009-01-14 - Beispiel 01

Aus VoWi
Zur Navigation springen Zur Suche springen

Mein Lösungsvorschlag:

Init:
initS(gruenW, 0);       // Regelt die Einfahrt in die Kreuzung der Autos aus Westen.
initS(gruenS, 0);       // Regelt die Einfahrt in die Kreuzung der Autos aus Süden.
initS(ampel_wartet, 0); // Verhindert, dass, nach Ablauf der 45 Sekunden Wartezeit der Ampel ein nachkommendes Auto in die Kreuzung einfahren kann, bevor die Ampel umschaltet.

Ampel:
forever(){
	V(gruenW);
	V(ampel_wartet);
	warte(45);
	P(ampel_wartet);
	P(gruenW);
	V(gruenS);
	V(ampel_wartet);
	warte(45);
	P(ampel_wartet);
	P(gruenS);
}

Auto-W:
P(gruenW);            // Auf grün warten.
P(ampel_wartet);      // Darauf warten, dass die Ampel wartet und somit die Straße für Autos frei ist.
// Ab hier kann kein weiteres Auto-W in die Kreuzung einfahren und auch die Ampel kann nicht umschalten.
kreuzung_passieren();
V(ampel_wartet);      // Semaphor ampel_wartet freigeben.
// Zu diesem Zeitpunkt können nachkommende Autos noch nicht in die Kreuzung einfahren, da diese ja auf den Semaphor gruenW warten, der aber noch nicht freigegeben ist.
// Sind zu diesem Zeitpunkt die 45 Sekunden Wartezeit der Ampel verstrichen, so ist es dieser jetzt schon möglich, den Semaphor gruenW zu dekrementieren und somit nachkommende Autos aus Westen nicht mehr in die Kreuzung einfahren zu lassen.
V(gruenW);            // Kreuzung wurde passiert und Semaphor gruenW wird für nachkommende Autos und die Ampel freigegeben.

Auto-S:               // Analog zu Auto-W, nur eben mit Semaphor gruenS
P(gruenW);
P(ampel_wartet);
kreuzung_passieren();
V(ampel_wartet);
V(gruenW);

https://web.archive.org/web/*/www.informatik-forum.at/showthread.php?85457