Parallel Programming Condition Queues

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmen und Datenstrukturen
Advertisements

Vertieferseminar Geoinformation WS 02/03
10.2 Wechselseitiger Ausschluss in Hardware
Beim Start eines Prozesses in Windows NT, 2000 wird a der Programmtext aus der exe-Datei ab der dort angegebenen Adresse gespeichert.
Zusammenfassung der Vorwoche
Lineare Suche Divide-and-Conquer-Suche Kombinationssuche
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
Terminierung und Deadlocks Enkhbat Daginaa Betreuerin Prof. Heike Wehrheim Totale Korrektheit.
Kapitel 6.1 Nebenläufigkeit und wechselseitiger Ausschluss
Threads Richard Göbel.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Kapitel 10 Nebenläufigkeit und wechselseitiger Ausschluss
WHILE - Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
DO...WHILE Anweisung.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
1 Named Pipes alias FIFO Haben einen Eintrag im Dateisystem und sind somit durch Zugriffsrechte identifizierbar Ermöglichen die Kommunikation zwischen.
OpenMP Präsentation im Rahmen des Seminars
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
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.
DVG Klassen und Objekte
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
Einführung in die Programmierung Datensammlung
Thema: Fibonacci-Zahlen
Informatikunterricht mit Java
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Java programmieren mit JavaKara
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Kapitel 6 Nebenläufigkeit und wechselseitiger Ausschluss
Einführung in die Programmierung
Parallel Matrix Multiplication
Parallel Programming Thread Synchronization. Heute 1. Lösung zu Assignment 2 2. Erstellen und Starten von Threads in Java 3. Das synchronized Schlüsselwort.
Parallel Programming Proofs ( yay !)
Parallel Programming Parallel Matrix Multiplication
2.4 Rekursion Klassifikation und Beispiele
Prozess-synchronisation
Thread Synchronisation in JAVA
Variablenkonzept Klassisch, in Java Basistyp
Purga - Scriptengine Ein Einblick.
Betriebssysteme Übung 2. Tutorium. Task 1 – Locks (1) Wozu Locks? Dienen dazu, exklusiven Zugriff auf eine Ressource sicherzustellen Lock = binäre Semaphore.
Algorithmen und Datenstrukturen SS 2005
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 2 Dr. W. Narzt u. Dr. A. Stritzinger.
Algorithmen und Datenstrukturen Übungsmodul 3
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.
Parallelisierung für Multiprozessor-Maschinen Teil 2.
Parallelisierung für Multiprozessor-Maschinen
Mehrbenutzerzugriff auf GIS-Daten
SFZ FN Sj. 13/14 Python 3 Rekursion Inf K1/2 Sj 13/14
Threads in Java Wiederholung der BS Grundlagen Alois Schütte AOSD1.
Muster nebenläufiger Programmierung concurrent Packet von Java Alois Schütte AOSD1.
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Prof. Dr. Alois Schütte Advanced System Programming 1 Das concurrent Paket 1 Überblick 2 Lock 3 Condition 4 Queue 5 Executors.
Nsp Bedingungssynchronisation Motivation: Wenn für eine Operation auf einem Objekt die Voraussetzung nicht erfüllt ist, ist es häufig angebracht,
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
93 Das Monitorkonzept (nach Hoare/Brinch-Hansen 1974) Nur ein Prozess bzw. Thread kann zu einem bestimmten Zeitpunkt im Monitor aktiv sein => gegenseitiger.
M a r c – o l i v e r p a h l Informatik II – Kapitel 12 „Sortier-Algorithmen“ Zusammenfassung des Kapitel 12 Küchlin, Weber, Einführung in die Informatik,
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
, 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.
1.Event Queue.
 Präsentation transkript:

Parallel Programming Condition Queues

Heute 1. Lösung zu Assignment 2 2. Condition Queues Was sind Condition Queues ? Wann sind Condition Queues sinnvoll ? Wie verwendet man Condition Queues ? 3. Ausblick auf Assignment 3

1. – ASSIGNMENT 2

Teil 2 – Fragen Frage : Wieso reicht es nicht, die Methoden read und write ` synchronized ` zu machen ? Antwort : Dadurch wird nur verhindert, dass Producer und Consumer gleichzeitig schreiben / lesen. Hat keinen Einfluss auf die Reihenfolge der Operationen.

Teil 2 – Fragen Frage : Würde es ausreichen in den Methoden read und write anstelle von synchronized eine Bool sche Variable als Guard zu verwenden ? Antwort : Nein ! read und write sind keine atomaren Operationen ! Bonus : Warum ist i++ nicht atomar ?

Teil 3 – Fragen Frage : Reicht synchronized ( this ) in den jeweiligen run - Methoden von Producer und Consumer ? Antwort : Nein, denn this ist jeweils an ein anderes Objekt gebunden. Zwei unabhängige locks Schliessen sich gegenseitig nicht aus

Teil 3 – Fragen Frage : Welches Objekt sollte stattdessen als gemeinsamer Monitor verwendet werden ? Antwort : Egal, solange beide das selbe Objekt verwenden. Am einfachsten nimmt man die gemeinsame Instanz von UnsafeBuffer.

Source Code

Teil 3 – Fragen Vorteile / Nachteile von Synchronisation der Producer / Consumer gegenüber Synchronisation des Buffers ? Vorteile : Man kann beliebige Buffer verwenden ( auch UnsafeBuffer ) Ermöglicht zusätzliche Aktionen, die ausgeführt werden müssen, bevor andere Threads den Buffer verwenden Nachteile Mehr Aufwand Fehleranfällig ( besonders wenn neue Prozesse hinzukommen )

2. – CONDITION QUEUES

Condition queue Intrinsic queue Eine Erweiterung des Monitor - Locks in Java Situation : Thread fährt nur unter folgenden Bedingungen fort 1. Exklusiven Zugriff auf eine Resource ( Lock ) 2. Preconditions erfüllt Wie geht man mit Situationen um, wo (2.) nicht erfüllt ist ?

Conditiont Queue (Abstrakt) void run() { //aquire lock while(!BEDINGUNG) { //release lock //let other threads fix precondition //re-aquire lock } //lock && precondition yay! … }

Condition Queues (Konkret) void run() { synchronized(this) { while(!BEDINGUNG) { wait(); // this.wait() } //lock && precondition yay! … } //end-synchronized } //end-run

Condition Queues - Kommunikation synchronized void write ( int d ) { while ( isFull ) { wait (); } data = d ; isFull = true ; notifyAll (); } synchronized int read() { while(!isFull) { wait(); } int d = data; isFull = false; notifyAll(); return d; }

notify versus notifyAll a.notifyAll weckt alle Threads, die auf a warten ( via a.wait() ) Die geweckten Threads verlangen alle exlusiven Lock auf a. Konkurrieren auch mit allen anderen Threads, die diesen Lock wollen Jeder Thread wird einmal die Chance haben, fortzufahren ( Deadlock / Livelock ausgenommen )

notify versus notifyAll a.notify weckt einen (!) der Threads, die auf a warten ( via a.wait() ) Welcher der wartenden Threads aufgeweckt wird, hängt von der Implementierung ab ( könnte auch zufällig sein ) Verlangen Lock auf a ; konkurrieren mit allen anderen Threads, die ebenfalls Lock auf a wollen. Andere wartende Threads bleiben wartend bis jemand sie notified

notify vs. notifyAll - Empfehlung Einfacher Grundsatz : Immer notifyAll Erweiterter Grundsatz : Wenn ihr darüber nachdenken müsst, ob notify anstatt notifyAll funktioniert, nehmt notifyAll Szenario für notify : Es ist egal welcher Thread aufgeweckt wird. Beispiel : Pool von Workerthreads. Es spielt keine Rolle welcher der Worker aufgeweckt wird. Jeder kann die Arbeit verrichten.

Producer FlagBuffer buf; void run() { for(int counter = 0; counter < 10000; i++) { if(buf.isFull) { buf.wait(); } synchronized(buf) { buf.write(counter); buf.isFull = true; } }//end-for }//end-run Consumer FlagBuffer buf; void run() { while(true) { if(!buf.isFull) buf.wait(); synchronized(buf) { int counter = buf.read)); buf.isFull = false; if(counter >= 9999) { return; } //consume counter … }//end-while }//end-run Ist dieser Code korrekt ?

Producer FlagBuffer buf; void run() { for(int counter = 0; counter < 10000; i++) { synchronized(buf) { while(buf.isFull) buf.wait(); buf.write(counter); buf.isFull = true; notifyAll(); } //end-synchronized } //end-for } //end-run Consumer FlagBuffer buf; void run() { while(true) { synchronized(buf) { while(!buf.isFull) buf.wait(); int counter = buf.read)); buf.isFull = false; if(counter >= 9999) { return; } notifyAll(); } //end-synchronized //consume counter … } //end-while } //end-run Ist dieser Code korrekt ?

Producer FlagBuffer buf; void run() { synchronized(buf) { for(int counter = 0; counter < 10000; i++) { while(buf.isFull) buf.wait(); buf.write(counter); buf.isFull = true; buf.notifyAll(); } //end-for }//end-synchronized }//end-run Consumer FlagBuffer buf; void run() { while(true) { synchronized(buf) { while(!buf.isFull) buf.wait(); int counter = buf.read)); buf.isFull = false; if(counter >= 9999) { return; } buf.notifyAll(); }//end-synchronized //consume counter … }//end-while }//end-run Ist dieser Code korrekt ?

Richtig oder falsch? notify() weckt nur einen der wartenden Threads, während notifyAll() alle weckt a.wait() darf nur aufgerufen werden, wenn der aktuelle Thread den Lock auf a hält. a.notify() weckt einen der auf a wartenden Threads und lässt ihn um den Lock auf a konkurrieren.

3. – ASSIGNMENT 3

Mergesort Gegeben : Liste L mit n Zahlen ( int ) Gesucht : Sortierte Liste L Algorithmus : Teile L auf in zwei Listen der Länge n /2 Sortiere jede der Unterlisten rekursiv mit Mergesort Führe die zwei sortierten Unterlisten zusammen Ende der Rekursion : Listen mit nur 1 Element

Beispiel (Zerlegung) 5, 4, 3, 2, 1, 0 5, 4, 32, 1, 0 5, , 10 21

Zusammenführen (merging) Beispiel L 1:05 L 2:3445 Ausgabe : Per Definition Vergleichen Kopieren Zeiger bewegen Fertig !

Zusammenführen, Beispiel 0, 1, 2, 3, 4, 5 3, 4, 50, 1, 2 4, , 20 21

Mergesort, parallelisiert Welche Teile des Algorithmus können parallelisiert werden ? Unterlisten sortieren Zwei Unterlisten zusammenführen Synchronisationsprobleme ? Zwei Unterlisten erst zusammenführen, wenn sie fertig sortiert sind Performance Anzahl Threads Länge der Liste

Performance-Messung n t … ´ 000 × 500 ´ 000 × 1 ´ 000 ´ ´ 000 ´ 000 n Länge der Liste t Anzahl Threads Frage : Wieviele Threads sind optimal ?

Wie misst man Zeit? System.currentTimeMillis() Nicht jede Millisekunde aktualisiert Nicht auf Millisekunden genau System.nanoTime() Präzision in Nanosekunden Nicht auf Nanosekunden genau Für uns ist currentTimeMillis() gut genug

Wie misst man Zeit long start; long end; start = System.currentTimeMillis(); //zu messender Vorgang end = System.currentTimeMillis(); System.out.println(Time elapsed: + (end-start));

Auf einen Thread warten Welche Möglichkeiten kennt ihr ? Busy wait ( in Schleife überprüfen, ob Thread fertig ; Assignment 3) Condition Queues ( wait(), notifyAll() ) Warten bis der Thread sich selbst beendet : t.join()

t.join() Thread t = new Thread(myRunnable); t.start(); //do our own stuff in the meantime try { t.join(); //wait for the other thread to catch up } catch(InterruptedException e) { /* ignore */ } t.join(); t.start();

Zu beantwortende Fragen Ist die parallele Version schneller ? Nicht selbstverständlich : Verwaltungsaufwand Wieviele Threads bieten optimale Performance ? Welchen Einfluss haben CPU Modell CPU Taktfrequenz Anzahl Cores verfügbarer Arbeitsspeicher verfügbarer Adressraum (32 Bit vs. 64 Bit )

Unangenehme Realität Ideale Welt N Prozessoren führen zu einem N - fachen Anstieg der Rechenleistung Realität Jeder zusätzliche Prozessor muss auch verwaltet werden. Viele Abläufe können erst gar nicht parallelisiert werden ( rein Sequentiell ) Kommunikation / Synchronisation können Wartezeiten zur Folge haben

FRAGEN?