Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 1 Thread-Konzept in objektorientierten.

Ähnliche Präsentationen


Präsentation zum Thema: "Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 1 Thread-Konzept in objektorientierten."—  Präsentation transkript:

1 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Thread-Konzept in objektorientierten Programmiersprachen

2 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Threads ein Thread ist ein eigenständiges Programmfragment, das parallel zu anderen Teilen eines Programmes ablaufen kann alle Threads eines Programmes teilen sich einen gemeinsamen Adressraum (leichtgewichtiger Prozeß) in einem Multithreading-System verwaltet die Rechnerkern- vergabe (Scheduler) die zur Ausführung anstehenden Threads man unterscheidet zwei Arten der Parallelität: –pseudoparallele Abarbeitung auf Einprozessorsystemen –echte parallele Abarbeitung auf Mehrprozessorsystemen

3 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Threads in Java Threads werden in der virtuellen Maschine durch Objekte der Klasse java.lang.Thread repräsentiert virtuelle Maschine verwendet Thread-Objekte zum Starten, Starten oder Suspendieren von Threads ein Thread beginnt die Ausführung mit dem Aufruf der run()- Methode des Thread-Objektes Deklaration eines Threads Konstruktion einer Unterklasse der Klasse Thread Implementierung des Interfaces Runnable Erzeugen eines Threads Erzeugen eines Objektes einer Unterklasse der Klasse der Thread Erzeugen eines Thread-Objektes unter Angabe eines Objektes einer Klasse, welches das Interface Runnable implementiert

4 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Deklaration und Erzeugen eines Threads class TextThread extends Thread { String text; public TextThread(String text){ this.text = text; } public void run() { for(int i = 0; i< 10; i++) System.out.println(text); }... TextThread java = new TextThread(´´Java´´); java.start(); TextThread expresso = new TextThread(´´Expresso´´); expresso.start();

5 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Deklaration und Erzeugen eines Threads class TextThread implements Runnable { String text; public TextThread(String text){ this.text = text; } public void run() { while( true ) System.out.println(text); }... TextThread java = new TextThread(´´Java´´); Thread thread = new Thread(java); thread.start();

6 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Zustände eines Threads seit JDK 1.2 verworfen resume() suspend() resume() suspend() interrupt() sleep() notify(), interrupt() wait(), join() run() zu Ende stop() start() new Scheduler yield() schlafend suspendiert blockiert erzeugt rechenwillig beendet rechnend

7 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Steuerung eines Threads Starten eines Threads java.start(); Beenden eines Threads java.stop(); Unterbrechen eines Threads java.suspend(); Fortsetzen eines Threads java.resume(); Pausieren eines Programmes try { java.sleep(1000) // 1000 ms } catch ( InterruptedException e) { }

8 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Steuerung eines Threads interrupt() - Wecken von schlafenden bzw. blockierten Threads yield() - der aufrufende Thread gibt freiwillig die CPU ab isAlive() - true, falls der Thread gestartet, aber nicht beendet ist join() - wartet auf das Ende des Threads, für den die Methode aufgerufen wurde setName(String) - ändert den Namen des Threads getName() - gibt den Namen des Threads aus setPriority(int) - ändert die Priorität des Threads Thread.MIN_PRIORITY = 0 Thread.MAX_PRIORITY = 10 (Standard - Thread.NORM_PRIORITY = 5) getPriority() - gibt die Priorität des Threads aus

9 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Problem: Zugriff auf gemeinsame Daten abc prog.c prog.n Spooler- Katalog Thread A Thread B out = 4 in = 7

10 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Vermeidung von Wettkampfbedingungen Situationen, bei der zwei oder mehrere Threads auf gemeinsame Daten zugreifen und deren Ergebnisse vom Fortschritt eines Threads abhängen, heißen Wettkampfbedingungen Benötigt wird ein Verfahren zur Gewährleistung eines gegen- seitigen Ausschlusses von Threads Programmteil aus dem auf den gemeinsamen Speicher zugegriffen wird heißt kritischer Bereich Vermeidung von Wettkampfbedingungen: 2 Threads dürfen sich nicht gleichzeitig in kritischen Bereichen aufhalten keine Annahme über relative Geschwindigkeit der Threads kein Threads außerhalb eines kritischen Bereiches darf einen anderen blockieren kein Thread sollte beliebig lange auf den Eintritt in einen kritischen Bereich warten

11 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Synchronisationskonzept: Semaphor Mechanismus zum wechselseitigen Ausschluss und zur Synchronisation von Threads (Dijkstra, 1965) Ein Semaphor ist eine gemeinsam benutzte Integer-Variable S auf die nur die drei Operationen Init, P(asseer) und V(erlaat) zugreifen können P(S): if(S > 0) then S = S-1; else { stoppe ausführenden Thread; trage den Thread in die Warteliste von S ein; } V(S): S = S + 1; if(Warteliste von S !=  ) then { wähle Thread Q aus Warteliste von S; springe zu der P-Operation in Q, durch die Q gestoppt wurde; } System muss atomare Ausführung von P und V garantieren

12 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Anwendung: Semaphor Definition kritischer Abschnitte: Sei S mit 1 initialisiert P(S); { kritischer Abschnitt } V(S); Synchronisation von Threads: Sei S mit 0 initialisiert Thread A Thread B {... {... V(S); P(S); // B wartet auf A...} Initialisierungswert n > 1: Verwaltung kritischer Bereiche, die von n Threads gleichzeitig genutzt werden können

13 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Beispiel: Producer und Consumer Threads abc cde efg Puffer out = 1 in = 4 Consumer Producer

14 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Beispiel: Producer und Consumer Threads Semaphore nichtvoll = 5, // Puffer ist nicht voll, initialisiert mit Puffergröße 5 nichtleer = 0, // Puffer ist nicht leer gesperrt = 1; // Puffer wird gelesen oder beschrieben Producer: do{ Erzeuge Datum; P(nichtvoll); P(gesperrt); Lege Datum im Puffer ab; V(gesperrt); V(nichtleer); } until true; Consumer: do{ P(nichtleer); P(gesperrt); Nimm Datum aus Puffer; V(gesperrt); V(nichtvoll); Verbrauche Datum; } until true;

15 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Probleme bei Semaphoren Falsche oder missbräuchliche Anwendung durch den Programmierer V(S);P(S);... P(S); Auftreten von Verklemmungen (Deadlocks) P(S 1 ); P(S 2 ); P(S 2 ); P(S 1 );... V(S 2 ); V(S 1 ); V(S 1 ); V(S 2 ); Verklemmungen können durch Anforderung aller Semaphore vor Eintritt in den kritischen Bereich vermieden werden

16 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Synchronisationskonzept: Monitor Semaphormechanismen für wechselseitigen Ausschluss und Synchronisation werden in einem Monitor (Hoare, Hansen) gekapselt Monitor ist ein abstrakter Datentyp mit der zusätzlichen Eigenschaft des wechselseitigen Ausschluss Bedingungsvariablen S mit denen über wait(S) und notify(S) zugegriffen werden kann Deklaration gemeinsamer Variablen Deklaration von Operationen Initialisierungscode Eingabeschlange für Threads

17 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Monitore in Java Ein Monitor ist die Kapselung eines kritischen Bereiches mit Hilfe einer automatisch verwalteten Sperre jedes von der JVM angelegte Objekt verfügt über eine Sperre Schlüsselwort synchronized markiert Methoden in einer Klasse für die ein Thread vor Ausführung die Sperre verlangen muß class SpeechSynthesizer{ synchronized void say(String words){ // Speak } Sperre wird immer von einem Objekt angefordert nicht statische Methode => Objekt mit dem die Methode aufgerufen wird statische Methode => Class-Objekt der entsprechenden Klasse

18 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Beispiel class SpreadSheet { int cellA1, cellA2, cellA3; synchronized int sumRow() { return cellA1 + cellA2 + cellA3; } synchronized void setRow(int a1, int a2, int a3){ cellA1 = a1; cellA2 = a2; cellA3 = a3; } Aufruf von sumRow() oder setRow() über ein Objekt a verlangt jeweils die Sperre von Objekt a

19 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Beispiel class SpreadSheet { static int cellA1, cellA2, cellA3; synchronized static int sumRow() { return cellA1 + cellA2 + cellA3; } synchronized static void setRow(int a1, int a2, int a3){ cellA1 = a1; cellA2 = a2; cellA3 = a3; } Aufruf von sumRow() oder setRow() verlangt jeweils die Sperre von dem Class-Objekt der Klasse SpreadSheet

20 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Synchronisation von Blöcken Schlüsselwort synchronized kann für Blöcke verwendet werden Angabe eines Objektes, dessen Sperre verwendet werden soll synchronized (myObject){ // Anweisungsblock der synchronisiert werden muß... } synchronized void myMethod(){ void myMethod(){... synchronized (this){ }... } Synchronisation von Blöcken oder Methoden verschiedener Klassen

21 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Freigabe von Sperren wait() und notify() erweitern Synchronisationsmechanismen Methodenaufruf wait() bewirkt: Thread beendet Bearbeitung eines synchronisierten Blocks und geht in den “schlafenden” Zustand Sperre für den synchronisierten Block wird freigegeben Methodenaufruf notify() bewirkt: mit wait() in den schlafenden Zustand versetzter Thread, kann wieder die Sperre des entsprechenden Objektes anfordern notify() aufrufender Thread beendet normal die Ausführung auf dem synchronisierten Block “aufgeweckter” Thread kann (muß aber nicht) als nächstes die Sperre erhalten und führt dann die Bearbeitung fort überladene Version der wait-Methode und notifyAll()-Methode

22 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Beispiel class MyThing { synchronized void waiterMethod() { // Ausführung irgendwelche Sachen wait(); // Weiterbearbeitung der Methode } synchronized void notifierMethod() { // Ausführung irgendwelcher Sachen notify(); // Weitere Arbeiten werden ausgeführt werden } synchronized void relatedMethod(){ // Ausführung irgendwelcher Arbeiten }

23 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Beispiel: Producer und Consumer Threads class Producer extends Threads{ static final int MAXQUEUE = 5; private Vector messages = new Vector(); public void run(){ try{ while(true){ putMessage(); sleep( 1000); } catch (InterruptedException e){ } }...

24 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Beispiel: Producer und Consumer Threads... private sychronized void putMessage() throws InterruptedException{ while( message.size == MAXQUEUE) wait(); message.addElement( new java.util.Date().toString()); notify(); } public synchronized String getMessage() throws InterruptedException { notify(); while( messages.size() == 0 )wait(); String.message = (String) messages.firstElement(); messages.removeElement( message ); return message; }

25 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Beispiel: Producer und Consumer Threads class Consumer extends Threads { Producer producer; Consumer( Producer p){ producer = p; } public void run() { try { while( true ){ String message = producer.getMessage(); System.out.println(´´Got message: ´´ + message); sleep( 2000 ); } } catch ( InterruptedException e ) { } }

26 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Rechnerkernvergabe Rechnerkernvergabe (Scheduler) entscheidet welcher der lauffähigen Threads den Rechnerkern zugewiesen bekommt Rechnerkernvergabe sollte garantieren, dass jeder Thread einen gerechten Anteil an der CPU erhält die CPU zu 100 Prozent ausgelastet wird die Antwortzeit für interaktive Benutzer minimiert wird die Anzahl der bearbeiteten Aufträge pro Stunde maximiert werden Hauptproblem: Laufzeitverhalten der im System befindlichen Threads kann nicht vorausgesagt werden Rechnerkernvergabestrategien können in verdrängende und nicht verdrängende Strategien (non preemptive und preemptive scheduling) unterteilt werden

27 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Nicht verdrängende Rechnerkernvergabestrategien FIFS-Strategie: Threads erhalten den Prozessor in der Reihenfolge ihres Eintretens in die Liste `rechenwillig´ Prioritätengesteuerte Rechnerkernvergabe: Warteschlangen Priorität RK Warteschlange ACEB AE B C

28 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Verdrängende Strategien: Round-Robin-Verfahren jedem Thread wird eine Zeitscheibe zugewiesen, innerhalb welcher er laufen darf Umschalten der CPU Zeitscheibe ist abgelaufen Thread terminiert oder wird blockiert Rechnerkernvergabe verwaltet Liste rechenwilliger Threads – Zeitscheibe abgelaufen  Einfügen am Ende der Liste Festlegen der Dauer einer Zeitscheibe kleine Zeitscheibe  geringe Effizienz der CPU durch viele Kontextumschaltungen große Zeitscheibe  schlechte Antwortzeiten für interaktive Anforderungen Zeitscheibe um 100 ms ist häufig ein vernünftiger Kompromiss

29 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Prioritätengesteuertes Round-Robin-Verfahren Priorität hoch tief innerhalb der nach Prioritäten geordneten Warteschlangen wird das Round-Robin-Verfahren angewandt

30 Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS Methoden zur Rechnerkernvergabe in Java Prioritätengesteuerte Rechnerkernvergabe Rechnerkernabgabe sleep(), wait(), yields() und stop()


Herunterladen ppt "Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 1 Thread-Konzept in objektorientierten."

Ähnliche Präsentationen


Google-Anzeigen