Prof. Dr. rer. nat. Roland Wism ¨uller
Aufgabenblatt 8
(Besprechung am 09.12.2021)
Vorlesung Betriebssysteme I Wintersemester 2021/22
Aufgabe 1: Leser-Schreiber Synchronisation
In einer fr¨uheren Aufgabe haben Sie eine L¨osung f¨ur das Leser/Schreiber (Reader/Writer) Problem (siehe Vorlesung Kapitel 3.1.5) unter Verwendung vonMonitorenin einer Pseudo-Programmiersprache angegeben.
Modifizieren Sie diese L¨osung so, dass von allen Lesern nur maximal 3 gleichzeitig auf die Daten zugreifen d¨urfen.
Aufgabe 2: Toiletten-Synchronisation mit Monitoren
Eine Universit¨at in den USA will aus Gr¨unden der politischen Korrektheit eine Doktrin des U.S. Supreme Courts
”‘Ge- trennt aber gleich’ bedeutet Ungleichheit“ (Separate but equal is inherently unequal) nicht nur auf die Rasse, sondern auch auf das Geschlecht anwenden und die lange w¨ahrende Praxis der nach Geschlechtern getrennten Toiletten beenden.
Es gibt jedoch ein Zugest¨andnis an die Tradition: Wenn (mindestens) eine Frau auf der Toilette ist, darf nur eine andere Frau und kein Mann eintreten und umgekehrt.
Realisieren Sie einenMonitorin Pseudo-Code, der zur L¨osung dieses Synchronisationsproblems die folgenden Prozedu- ren zur Verf¨ugung stellt:
• Frau_moechte_eintreten
• Frau_verlaesst_die_Toilette
• Mann_moechte_eintreten
• Mann_verlaesst_die_Toilette
Aufgabe 3: Synchronisation mit Monitor
Der nachfolgende Pseude-Code zeigt einen Monitor, der eine Sicherheitsmaßnahme f¨ur Linienbusse realisiert: Der Bus darf die T¨ure erst ¨offnen, nachdem die die Haltestellenbremse bet¨atigt wurde. Erg¨anzen Sie den Monitor um die notwen- dige Synchronisation, die sicherstellt, daß die ProzedurTuerAufsolange wartet, bisHaltestellenbremseAnausgef¨uhrt ist.
Bus
HaltestellenbremseAn
TuerAuf
end;
end monitor;
...
begin
condVar; procedure
boolean monitor
condition
begin procedure
// Türe öffnen end;
// Bremse anziehen bremseAn = false;
Anmerkung: dies ist eine Aufgabe im Klausurstil.
1
Aufgabe 4: Erzeuger-Verbraucher Synchronisation
In dieser Aufgabe soll das Erzeuger-Verbraucher Problem (siehe Vorlesung Kapitel 3.1.5 und 3.1.7) n¨aher betrachtet werden. In dem gegebenen Code ist der beschr¨ankte Puffer durch ein Array (Ringpuffer) realisiert. Von Interesse sind die Aspekte der Synchronisation: der Erzeuger bzw. der Verbraucher m¨ussen blockiert werden, wenn der Puffer voll bzw. leer ist, und die Zugriffe auf den Puffer m¨ussen unter wechselseitigem Ausschluss ausgef¨uhrt werden.
Laden Sie den Beispiel-Code f¨ur dasErzeuger/Verbraucher-Problem in Javavon der Webseite herunter (unter
”Materiali- en“).
Entpacken Sie das Archiv. Die drei Implementierungen (reines Java; mit Semaphoren; mit Mutex und Bedingungsva- riablen) werden in drei Verzeichnisse (Java, Semaphore und MutexCondition) entpackt. Das Archiv enth¨alt auch das SynchronisationspaketBSsync.jar, das f¨ur die ¨Ubersetzung und Ausf¨uhrung ben¨otigt wird (siehe Kommentar im Co- de).
F¨ur zus¨atzliche Informationen siehe Vorlesung Kapitel 3.1.4 bis 3.1.7.
a) Ubersetzen Sie jede Implementierung und f¨uhren Sie das Programm aus. Die Ausgabe des Programms ist erweitert¨ durch dieLock-Klassen-Variableverbose. Analysieren Sie die Ausgabe und beobachten Sie, wie die Threads sich synchronisieren.
b) Uberlegen Sie, ob die L¨osungen frei von Deadlocks sind. Begr¨unden Sie Ihre Antwort. Erzeugen Sie noch zwei¨ Threads (ein Erzeuger und ein Verbraucher) und f¨uhren Sie die Programme erneut aus. Beschreiben Sie Ihre Beob- achtungen.
Hinweis: Verwenden Sie die Seiten der Dokumentation f¨ur das SynchronisationspaketBSsync, die Sie ¨uber die Vorlesungs-Webseite (unter
”Materialien“) erreichen.
Aufgabe 5: Synchronisation: Implementierung eines Semaphors
Implementieren Sie eine Java KlasseMySemaphore, die ein (z¨ahlendes) Semaphor mit Hilfe des Synchronisationspakets BSsync.jar(LockundCondition) realisiert. Die Klasse soll folgenden Aufbau haben:
public class MySemaphore {
// Erzeugt neues Semaphor mit initialem Wert
public MySemaphore(int initVal) { ... }
// P−Operation
public void acquire() { ... }
// V−Operation
public void release() { ... } }
Testen Sie Ihre L¨osung, indem Sie z.B. zwei Threads so synchronisieren, daß Sie eine streng abwechselnde Ausgabe machen (siehe vorhergehendes ¨Ubungsblatt).
Aufgabe 6: Rendezvous-Problem
Die Fachgruppe BSVS hat sich zu einem gemeinsamen Mensabesuch verabredet. Als Treffpunkt wurde der Geb¨audekern auf Ebene 8 am H¨olderlin-Campus benannt. Erst wennalleMitglieder der Fachgruppe dort eingetroffen sind, geht die Gruppe gemeinsam in Richtung Mensa.
Sehen Sie sich die DateiRendezvous.javaan. Erweitern Sie die Methoderendezvous(), sodass sie das oben be- schriebene Verfahren implementiert, also alle Threads in der Methode blockieren, bis diese von allen Threads aufgerufen wurde. Achten Sie darauf, dass das System nicht verklemmt und benutzen Sie das PaketBSsyncvon der Webseite.
Sie k¨onnen davon ausgehen, dass ein Thread die Methoderendezvous()nicht mehr betritt, nachdem er sie verlassen hat.
2
Aufgabe 7: Toiletten-Synchronisation in Java (f ¨ ur Motivierte)
In einer fr¨uheren Aufgabe haben Sie das Problem der Synchronisation f¨ur den Zugang zu Toiletten realisiert, die von Frauen und M¨annern gleichermaßen benutzt werden k¨onnen. Schreiben Sie ein Java-Programm, das diese L¨osung imple- mentiert.
Testen Sie Ihre L¨osung mit unterschiedlichen Anzahlen von
”Frau“ und
”Mann“ Threads. Sie k¨onnen (und sollen!) Ihre L¨osung in der ¨Ubung pr¨asentieren.
3