93 Das Monitorkonzept (nach Hoare/Brinch-Hansen 1974) Nur ein Prozess bzw. Thread kann zu einem bestimmten Zeitpunkt im Monitor aktiv sein => gegenseitiger.

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
der Universität Oldenburg
10.2 Wechselseitiger Ausschluss in Hardware
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
3 Prozessverwaltung  sieht einen Prozess als Objekt der Verwaltung,
der Universität Oldenburg
Semaphore void Passieren (semaphore &s) { if (s > 0) { s--;
Kapitel 6.1 Nebenläufigkeit und wechselseitiger Ausschluss
Ausnahmen HS Merseburg (FH) WS 06/07.
Threads Richard Göbel.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Java: Grundlagen der Objektorientierung
Nebenläufige Programmierung
Ein Beispiel in Java.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Programmieren mit JAVA
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Projektplan: Fachgebiet Software Engineering Übersicht © Albert Zündorf, Kassel University.
1DVG3 - anonyme Klassen Anonyme Klassen. DVG3 - anonyme Klassen 2 Syntax new BasisKlasse(Parameterliste) { Modifikationen und Erweiterungen der Basisklasse.
Abstrakte Klassen DVG
DVG Interfaces. DVG mehrfache Vererbung 4 Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. –farbigerPunkt.
Abstrakte Klassen, Interface
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
Einführung in die Programmierung Datensammlung
Das Roboterprojekt Einführung Der erste Entwurf Das Thread-Konzept Hindernisse Website.
Java Threads Sebastian Werler
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Grundkonzepte Java - Klassendefinition
Java programmieren mit JavaKara
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
CuP - Java Elfte Vorlesung Montag, 11. November 2002.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Parallel Programming Condition Queues
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Thread Synchronisation in JAVA
Learning By Doing Parallelverarbeitung Multithreading (Nebenläufigkeit) Alte Idee der Parallelverarbeitung statt rein sequentieller Prozesse Parallelverarbeitung.
Letzte Chance!!! Exceptions Thread, Runnable Synchronized Wait, notify, notifyAll Thread States Semaphoren JCSP Swing JOMP Linearizability History Amdahl‘s.
Javelin Internet-based parallel computing using Java.
Programmiervorkurs WS 2014/15 Methoden
Programmiervorkurs WS 2014/15 Instanzmethoden
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
Threads in Java Wiederholung der BS Grundlagen Alois Schütte AOSD1.
Muster nebenläufiger Programmierung concurrent Packet von Java Alois Schütte AOSD1.
Robuste Programme durch Ausnahmebehandlung
Prof. Dr. Alois Schütte Advanced System Programming 1 Das concurrent Paket 1 Überblick 2 Lock 3 Condition 4 Queue 5 Executors.
Java-Kurs - 3. Übung Hausaufgabe Arrays For-Schleifen.
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Nsp Bedingungssynchronisation Motivation: Wenn für eine Operation auf einem Objekt die Voraussetzung nicht erfüllt ist, ist es häufig angebracht,
3 Interaktion über Objekte. 3.1 Sperrsynchronisation dient der Vermeidung unkontrollierter nebenläufiger Zugriffe auf gemeinsame Datenobjekte und der.
Java-Kurs Übung Besprechung der Hausaufgabe
Threads in Java Threads  Sprachumfang von Java Der Java-Standard fordert nur die Unterstützung von Thread-Prioritäten. Es gibt keine Forderung bzgl.:
3.2 Bedingungssynchronisation Motivation: Wenn für eine Operation auf einem Objekt die Voraussetzung nicht erfüllt ist, ist es häufig angebracht, auf deren.
Parallel Programming Semaphores / Reader - Writer - Lock
1 VE 11 Kruskal-Realisierung Listen. 2 Auf dem Weg zur Kruskal-Realisierung Vorüberlegungen: Der Graph könnte dargestellt werden als Menge von Knoten,
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Thread-Konzept in objektorientierten.
, Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, WS 2005/06 1 Beispiel class SpreadSheet { int cellA1, cellA2, cellA3; synchronized.
Java Programme nur ein bisschen objektorientiert.
, Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Exceptions in der Programmiersprache Java.
, Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Synchronisation mit Monitoren Threads können in Java parallel ablaufen, oft.
Praktische Informatik 1
Implementieren von Klassen
 Präsentation transkript:

93 Das Monitorkonzept (nach Hoare/Brinch-Hansen 1974) Nur ein Prozess bzw. Thread kann zu einem bestimmten Zeitpunkt im Monitor aktiv sein => gegenseitiger Ausschluss, mutual exclusion. Geschützte Daten aufrufbare Operationen

94 Beispiel: Zählermonitor (Pseudosyntax) monitor counter { int count = 0 procedure reset () { count = 0 } procedure increment () { count += 1 } procedure decrement () { count -= 1 } } Implementierung mittels mutex-Semaphor: Jeder Prozedurrumpf wird in P(mutex) _ V(mutex) eingeschlossen.

95 Einseitige Synchronisation in Monitoren Für einseitige (bedingte) Synchronisationen innerhalb von Monitoren ist eine Erweiterung des Basiskonzeptes nötig. Bedingungsvariablen (condition variables) sind Monitor-interne Synchronisationsvariablen mit den Operationen wait (cond) „Warte auf Erfülltsein von Bedingung cond“ Der ausführende Prozess wird suspendiert und in eine Warteschlange für cond eingereiht. Der Monitor wird freigegeben. signal(cond) „Signalisiere, dass cond gilt.“ Der ausführende Prozess reakiviert den „ältesten“ Prozess in der Warteschlange zu cond. Es gibt verschiedene Signalisierungsmethoden, die festlegen, welcher Prozess nach einem signal im Monitor aktiv ist.

96 Signalisierungsmethoden signal and continue (SC) -> Java Der signalisierende Prozess bleibt aktiv. Der reaktivierte Prozess muss sich neu um den Monitorzugang bewerben. Die Gültigkeit der signalisierten Bedingung muss erneut geprüft werden. signal and exit (SX) -> Concurrent Pascal Ein signal ist nur am Ende von Monitorprozeduren erlaubt. Der reaktivierte Prozess erhält sofort Zugang zum Monitor. Die Gültigkeit der signalisierten Bedingung ist garantiert. signal and wait (SW) -> Modula Der signalisierende Prozess muss auf erneuten Monitorzugang warten. Der reaktivierte Prozess erhält den Monitorzugang. Die Gültigkeit der signalisierten Bedingung ist garantiert.

97 Monitor-Simulation eines Semaphors monitor Semaphor { int s = 0 condvar positiv procedure Psem () { while (s == 0) { wait(positiv) } s -= 1 } procedure Vsem () { s += 1 signal (positiv) }

98 Monitor für beschränkten Puffer monitor Bounded_Buffer { typeT buf[n] int front = 0; rear = 0; count = 0 ## Invariante: rear = (front + count) mod n condvar not_full, not_empty procedure enter (typeT data) { while (count == n) { wait(not_full) } buf[rear] = data; count += 1; rear = (rear+1) mod n signal (not_empty) } procedure get (typeT &result) { while (count == 0) { wait(not_empty) } result = buf [front]; count--; front = (front+1) mod n signal (not_full) }

Exkurs: Thread-Synchronisation in Java Threads Wechselseitiger Ausschluss Bedingte Synchronisation Deadlock

100 Die Klasse Thread Die Klasse Thread gehört zur Standardbibliothek von Java. Zur Generierung eines weiteren Kontrollflusses muss zunächst ein Objekt dieser Klasse erzeugt werden: Thread worker = new Thread (); Dieses kann dann konfiguriert werden (Setzen von initialer Priorität, Namen etc.) und anschließend zum Ablauf gebracht werden. Durch Aufruf der Methode start wird ein auf den Daten im Thread- Objekt basierender Kontrollfluß initiiert und durch Aufruf der Methode run aktiviert. Die Methode run muss für erweiterte Thread-Klassen neu definiert werden. Die voreingestellte Implementierung ist wirkungslos.

101 Beispiel: Die Klasse PingPong class PingPong extends Thread { String word;int delay; PingPong (String whatToSay, int delayTime) { word = whatToSay;delay = delayTime; } public void run() { try { for (;;) { System.out.print(word+‘‘ ‘‘); sleep(delay); } } catch(InterruptedException e) {return; } } public static void main (String[] args) { new PingPong (‘‘ping‘‘,33).start(); new PingPong (‘‘PONG‘‘,100).start(); }

102 Das Interface Runnable Alternativ können Threads durch Implementierung des Interfaces Runnable programmiert werden: class Simple implements Runnable { public void run() {... } } Threaderzeugung Runnable s = new Simple(); new Thread(s).start(); Vorteil: Die Klasse Simple kann auch andere Klassen erweitern, was als Erweiterung der Thread-Klasse nicht möglich wäre.

103 Threaderzeugung in 4 Schritten 1.Definition einer neuen Klasse als Erweiterung der Thread-Klasse oder als Implementierung des Runnable-Interfaces 2.Definition einer Methode run in der neuen Klasse Festlegung des Thread-Anweisungsteils 3.Erzeugung einer Klasseninstanz mit der new- Anweisung 4.Starten des Threads mit der Methode start.

104 Thread-Life Cycle mögliche Ursachen: Aufruf von sleep-Methode Aufruf von wait-Methode Warten auf Ein-/Ausgabe

105 Wechselseitiger Ausschluss mit synchronized deklarierten Methoden: Wird eine solche Methode aufgerufen, wird eine Sperre gesetzt und es kann keine andere als „synchronized“ deklarierte Methode ausgeführt werden, solange die Sperre gesetzt ist. Bsp: class Account { private double balance; public Account (double initialDeposit) {balance = initialDeposit; } public synchronized double getBalance () {return balance; } public synchronized void deposit (double amount) {balance += amount;} } Eine Klasse, deren extern aufrufbare Klassenmethoden alle mit synchronized versehen sind, entspricht somit weitgehend dem Monitorkonzept.

106 mit dem synchronized Konstrukt: synchronized ( ) expr wird zu einem Objekt (oder Array) ausgewertet, das für einen weiteren Zugriff geschlossen werden soll. Falls das Schloss offen und damit der Eintritt erlaubt ist, wird statement ausgewertet. Bsp: Alle Elemente eines Feldes sollen nicht negativ werden. public static void abs (int[] values) { synchronized(values) { for (int i=0; i<values.length; i++) { if (values[i] < 0) values[i] = -values[i]; } Wechselseitiger Ausschluss

107 Beispiel: Producer-Consumer public class Producer/Consumer extends Thread { private CubbyHole cubbyhole; private int number; public Producer/Consumer (CubbyHole c, int number) { cubbyhole = c; this.number = number; } public void run() { for (int i = 0; i < 10; i++) { cubbyhole.put(number, i); try { sleep((int)(Math.random() * 100)); } catch (InterruptedException e) { } } public void run() { int value = 0; for (int i = 0; i < 10; i++) { value = cubbyhole.get(number); }

108 Ein-Platz-Puffer - 1. Ansatz - public class CubbyHole { private int contents; private boolean available = false; public synchronized int get (int who) { if (available == true) { available = false; System.out.println("Consumer " + who + " got: " + contents); return contents; } public synchronized void put (int who, int value) { if (available == false) { contents = value; available = true; System.out.println("Producer " + who + " put: " + contents); }

109 Bedingte Synchronisation Monitorkonzept nach Lampson/Redell (1980) Die Klasse Object enthält Methoden wait zum Blockieren von Threads notify zum Reaktivieren des am längsten wartenden Threads notifyall zum Reaktivieren aller wartenden Threads die von allen Klassen ererbt werden. Es gibt keine Bindung an eine Bedingungsvariable, jedoch dürfen wait und notify nur in synchronized-Klassenmethoden vorkommen. Im Unterschied zu dem im Monitorkonzept von Hoare verwendeten signal führt notify nicht zur unmittelbaren Ausführung des reaktivierten Threads, sondern lediglich zu seiner Einreihung in die Warteschlange der auf die Ausführung einer synchronisierten Methode wartenden Prozesse. notify ist gegenüber signal weniger fehleranfällig und erlaubt eine einfachere Warteschlangenverwaltung.

110 Standardschemata Bedingung abwarten: synchronized doWhenCondition () { while (!condition) wait();... „Aktion bei erfüllter Bedingung“... } Bedingung signalisieren: synchronized changeCondition () {... „Änderung von Werten, Bedingung erfüllen“... notify(); }

111 Ein-Platz-Puffer public class CubbyHole { private int contents; private boolean available = false; public synchronized int get (int who) { while (available == false) { try { wait(); } catch (InterruptedException e) { } } available = false; System.out.println("Consumer " + who + " got: " + contents); notifyAll(); return contents; } public synchronized void put (int who, int value) { while (available == true) { try { wait(); } catch (InterruptedException e) { } } contents = value; available = true; System.out.println("Producer " + who + " put: " + contents); notifyAll(); }

112 Deadlocks Synchronisierte Methoden eines Objektes können beliebige andere Methoden aufrufen (synchronisierte und nicht synchronisierte, desselben oder anderer Objekte) mögliche Ursachen für Deadlocks synchronisierte Methoden rufen sich gegenseitig auf Threads benötigen Locks auf mehrere Objekte irregulär terminierende Threads Java hat keine Mechanismen, um Deadlocks zu verhindern oder aufzulösen.

113 Deadlocks – ein konstruiertes Beispiel class Dead { // erzeugt zwei Threads public static void main (String[] args) { final Object resource1 = new Object(); final Object resource2 = new Object(); Thread t1 = new Thread( new Runnable() { public void run() { synchronized(resource1) { compute(1); synchronized(resource2) { compute(1); } ); Thread t2 = new Thread( new Runnable() { public void run() { synchronized(resource2) { System.out.println(); synchronized(resource1) { compute(2); } }}} ); t1.setPriority(6); t1.start(); t2.setPriority(10); t2.start(); }; static void compute(int i){ System.out.println("Thread"+ i); for (int k=0; k<= 2000; k++) System.out.print(k); } } // end Dead