Info B VL 16: Monitore und Semaphoren

Werbung
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
Konsument
2
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
wartend
wenn Zutritt
zum Monitor
fertig
wait()
notify()
eines anderen
Threads
blockiert
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 () {
// ...
s.V(); // Ereignis signalisieren
// ...
}
void process2 () {
// ...
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 () {
// ...
s.P();
// ... kritischer Abschnitt
s.V();
// ...
}
void process2 () {
// ...
s.P();
// ... kritischer Abschnitt
s.V();
// ...
}
Beispielcode: ProdConsDemo.java
Info B VL 16: Monitore und Semaphoren – p.326
Herunterladen