Info B VL 16: Monitore und Semaphoren Objektorientiere Programmierung in Java 2003 Ute Schmid (Vorlesung) Elmar Ludwig (Übung) FB Mathematik/Informatik, Universität Osnabrück Info B VL 16: Monitore und Semaphoren p.317
Wdh: Threads können im Prinzip parallel ausgeführt werden Vorteil: mehrere Dinge können (quasi) gleichzeitig ausgeführt werden Beispiel: Annahme von Benutzereingaben und gleichzeitige Erledigung von Aufgaben in Java: Erzeugung von Thread Objekten Wenn Threads auf gemeinsamen Daten arbeiten können Probleme entstehen Synchronisation Info B VL 16: Monitore und Semaphoren p.318
Wdh: Kommunikationsformen Produzent Auftraggeber 1 2 Konsument Auftragnehmer Produzent kann bereits im Voraus produzieren Server kann viele Clients bedienen Info B VL 16: Monitore und Semaphoren p.319
Wdh: Konflikte Wenn mehrere Threads auf dieselben Daten zugreifen müssen die entsprechenden Anweisungsblöcke synchronisiert werden Regelung des Zugriffs durch Monitor-Objekte! Einseitige Synchronisation bei kausaler Abhängigkeit (Konsument/Produzent): Schreib-/Lese-Konflikte Zweiseitige Synchronisation bei wechselseitiger Abhängigkeit: Schreib-/Schreib- und Schreib-/Lese-Konflikte Info B VL 16: Monitore und Semaphoren p.320
Illustration Beispielprogramm: ConsumerProducer.java Problem: Ein Produzent kann produzierte Daten eines anderen Produzenten überschreiben, bevor der Konsument die Daten abgeholt hat Problem: Produzent kann im Schreiben von Konsument unterbrochen werden, der dannn unvollständige Werte abholt Lösung? Info B VL 16: Monitore und Semaphoren p.321
Zustände von Threads (mit Monitor Objekten) vorhanden bereit laufend fertig wenn Zutritt zum Monitor wartend notify() eines anderen Threads blockiert wait() Monitor durch anderen Thread besetzt Info B VL 16: Monitore und Semaphoren p.322
Semaphoren (1) Von Dijkstra zur Synchronisation nebenläufiger Prozesse eingeführt. Begriff aus der Seefahrt: Optisches Signal zum Passeeren/passer (Passieren) und Vrijgeven/verlaat (Freigeben). Idee: Prozess wird im Synchronisationsfall blockiert und in Warteschlange eingeordnet. Die Warteschlange muss in Java nicht explizit definiert werden. Sie existiert implizit als Menge der blockierten Prozesse. Bei der Realisation durch Monitor wird jedoch durch notify() wird ein Prozess aktiviert (nicht unbedingt der, der am längsten wartet). Info B VL 16: Monitore und Semaphoren p.323
Semaphoren (2) Semaphoren sind abstrakte Datentypen: Objekte bestehen aus Zähler und Warteschlange. Operation P: Zähler wird um eins erniedrigt. Wenn negativer Wert, dann ist Prozess blockiert. (Warten auf das Eintreten einer Bedingung) Operation V: Zähler wird um eins erhöht. (Signalisieren des Eintretens einer Bedingung). Klasse: Semaphore.java Info B VL 16: Monitore und Semaphoren p.324
Synchronisation mit Semaphoren (1) Einseitig Semaphore s = new Semaphore(0); void process1 () { void process2 () { //... //... s.v(); // Ereignis signalisieren s.p(); // Ereignis abwarten //... //... } } Info B VL 16: Monitore und Semaphoren p.325
Synchronisation mit Semaphoren (2) Wechselseitig (Kritischer Abschnitt) Semaphore s = new Semaphore(1); void process1 () { void process2 () { //... //... s.p(); s.p(); //... kritischer Abschnitt //... kritischer Abschnitt s.v(); s.v(); //... //... } } Beispielcode: ProdConsDemo.java Info B VL 16: Monitore und Semaphoren p.326