320 likes | 445 Views
Proseminar. Java Threads Scheduling. Lei Chen November 2000. Jave Thread Scheduling. Popular--Scheduling Implementierung Native--Scheduling Unterst ü tzung Andere Thread--Scheduling Methoden Zusammenfassung. Teil I. P opular-Scheduling Implementierung. Was ist ein Green-Threads-Modell
E N D
Proseminar Java Threads Scheduling Lei Chen November 2000
Jave Thread Scheduling • Popular--Scheduling Implementierung • Native--Scheduling Unterstützung • Andere Thread--Scheduling Methoden • Zusammenfassung
Teil I Popular-Scheduling Implementierung
Was ist ein Green-Threads-Modell Green Threads sind Benutzer-Ebene-Threads Jeder Zeit darf einen einzigen Thread ausführen Green-Threads-Scheduling Wann wechselt die virtuelle Maschine den laufenden Thread? Für Implementierung von Green-Threads wird empfohlen, Priorität Vererbung zu benutzen Was wird passieren, wenn ein Thread eine Datei von einem leeren Socket lesen will? Realisierung im Betriebssystem mit „asynchonous I/O“ Realisierung im Betriebssystem ohne „asynchonous I/O“ Ein Beispiel für blockierten Thread Popular--Scheduling Implementierung 1. Green Threads
Was ist ein Green-Threads Modell Stack BS-Thread Betriebssystem(BS) Programm zähler JVM Java-Thread BS-Thread Processor … Bookkeeping Info. … BS-Thread Java-Thread Stack Programm zähler Bookkeeping Info. JVM: Java Virtuelle Maschine
Popular—Scheduling Implementierung Threads auf Benutzer- und System-Ebene Threads • Meisten Betriebssysteme haben zwei logische Teile: System-Ebene und Benutzer-Ebene • Was ist ein Systemaufruf • Ein Systemaufruf Beispiel • Vor- und Nachteil von dieser logischen Teilung • Vorteil: Schutz von Benutzerfehler • Nachteil: Aufruf des Betriebssystems
Popular—Scheduling Implementierung Ein Systemaufruf Beispiel Benutzer Ebene Ein Programm Systemaufruf System Ebene Der Kern des Betriebssystem Datei lesen
Popular—Scheduling Implementierung Benutzer-Ebene und System-Ebene Betriebssystem Benutzer-Ebene System-Ebene BS-Threads verwaltet ohne Systemaufrufe BS-Thread werden im BS-Kern verwaltet Beispiele
Popular—Scheduling Implementierung BS-Threads auf Benutzerebene JVM Anwendungsebene BS-Ebene BS-Bibliotheken Benutzerebene Der Kern des Betriebssystem Datei lesen Systemebene
Popular--Scheduling Implementierung Ein Implementierungsbeispiel von green-Threads-Scheduling public class LockTest { object someObject=new Object( ); class ThreadA extends Thread { ThreadA( ) { setPriority(Thread.Max_PRIORITY); } // mit Priorität 10; public void run( ) { synchronized(someObject) { wait( ); } someObject.methodA( ); } }
Popular--Scheduling Implementierung class ThreadB extends Thread { ThreadB( ) { setPriority(Thread.NORM_PRIORITY( ); } // mit Priorität 5; public void run( ) { synchronized(someObject) { someObject .notify( ); } someObject.methodB( ); } } static void main(String args[ ] ) { new ThreadA( ).start( ); new ThreadB( ).start( ); } }
Popular--Scheduling Implementierung 2.Windows-Native-Threads • Für jeden Java-Thread gibt es einen entsprechenden Thread vom Betriebssystem • Jeder Windows-Native-Thread kann als ein Prozeß angesehen werden • Verschiedene Implementierung der Java Virtuelle Maschine auf den Windows Plattformen • Schwierigkeit der Windows native Threads Implementierung • Viele Threads dürfen gleichzeitig in vielen CPUs ausführen
Popular--Scheduling Implementierung Windows-Native-Threads (2) • Windows-Native-Threads Scheduling • Abbildungstabelle von Java-Thread Priortäten auf Win32- Plattform • 7 Windows Threads Prioritäten für 11 Java Threads Prioritäten • 5 Scheduling Klassen für 7 Windows Threads Prioritäten • Andere wichtige Faktoren, die Thread-Priorität affektieren • Priorität Vererbung • Timeslice: Jeder Thread mit der gleichen Priorität kriegt ungefähr gleiche CPU Zeit • Priorität Hochschieben
Popular--Scheduling Implementierung Abbildungstabelle von Java-Thread Priortäten auf Betriebssystem(Win32- Plattform)
Popular--Scheduling Implementierung Solaris-Native-Threads • Es ist ein Zwei-Ebenen-Modell: • Benutzerebene-Threads-Modell: dem Betriebssystemkern unbekannt • System-Ebene-Threads (LWPs, lightweight processes) : dem Betriebssystemkern bekannt • Viele Threads in vielen CPUs dürfen gleichzeitig ausführen • Scheduling-Implementierung des Solaris-Native-Threads • Das Betriebssystem gíbt jedem LWP einen timeslice • Die Wirkung des timeslice(4 Beispiele) • wieviele LWPs(Lightweight-Process) hat die virtual Maschine? • Die virtuelle Maschine beginnt immer mit einem LWP • Wenn das LWP blockiert ist, und es noch wartende Threads gibt, dann wird das Betriebssystem ein neues LWP erzeugen • [LWPs]=[gleichzeitige blockierte Threads] +1 • Mit der Methode thr_setconcurrency() können wir mehre LWPs erzeugen
Solaris-Native-Threads Modell Anwendung BS BS-Kern Java Thread Solaris Thread LWP Processor JVM … … … … Solaris Thread LWP Processor Java Thread Priority-based Not timesliced timesliced JVM: Java Virtuelle Maschine
Die Wirkung der timeslicein Solaris-Native-Threads-Modell System-Ebene LWP1 LWP2 Solaris-Thread1 mit Priorität 5 Solaris-Thread2 mit Priorität 5 Solaris-Thread3 mit Priorität 5 LWP: lightweight processes Beispiel1
Die Wirkung der timeslicein Solaris-Native-Threads-Modell LWP1 LWP2 System-Ebene Solaris-Thread1 mit Priorität 5 Solaris-Thread2 mit Priorität 6 Solaris-Thread3 mit Priorität 4 LWP: lightweight processes Beispiel2
Teil 2 Native-Scheduling-Unterstützung
Native-Scheduling-Unterstützung Die Unterstützung von native scheduling • Anbindung von Native Scheduling in Java • Realisierung durch Klasse CPUSupport • Implementeriungen für Solaris und Windows
Native-Scheduling-Unterstützung Class CPUSupport public class CPUSupport{ static boolean loaded = false; static void CPUSupport{ try { System.loadLibrary(„CPUSupportWin“); loaded = true; } catch (Error e) { try { System.loadLibrary(„CPUSupportSolaris“); loaded = true; } catch (Error e) { System.err.println(„Warning: No platform library for CPUSupport“); } } }
private static native int getConcurrencyN( ); public static int getConcurrency ( ) { if (!loaded) //Assume green threads return 1; return getConcurrencyN( ); } private static native void setConcurrencyN(int i ); public static void setConcurrency (int n ) { if (loaded) setConcurrencyN(n ); }
private static native int getNumProcessorsN( ); public static int getNumProcessors ( ) { if (!loaded) //Assume green threads return 1; return getNumProcessorsN( ); } } getConcurrencyN, setConcurrencyN, getNumProcessorsN werden auf die entsprechenden Betriebssystemroutinen thr_getConcurrency, thr_setConcurrency und sysconf(_SC_NPROCESSORES_ONLN) von Solaris abgebildet.
Teil III • Andere Thread-Scheduling Methoden
Andere Thread-Scheduling Methoden Eine Übersicht über andere Thread-scheduling Methoden • Die Methode suspend() und resume() • void suspend() (nicht von Java2 unterstützt):Verhindern ein Thread am unendlichen Laufen • void resume() (nicht von Java2 unterstützt):Erlauben einem Thread nach suspend wieder zu laufen • Der suspended Zustand ist nicht gleich dem blockierten Zustand • Eine Anwendung mit den Methoden suspend() und resume()
Eine Anwendung mit den Methoden suspend() und resume() import java.applet.Applet; import java.awt.*; public class Fractal extends Applet implements Runnable{ Thread t; public void start() { if (t==null){ t=new Thread(this); t.setPriority(Thread.currentThread().getPriority()-1); t.start(); } else t.resume(); }
Eine Anwendung mit den Methoden suspend() und resume() public void stop() { t.suspend(); } public void run() { // Do calculations, occadionally calling repaint() } public void paint (Graphics g) { // Paint the completed sections if the fractal } }
Die Methode yield() erlaubt anderem Thread mit gleicher Priorität zu laufen (Verzichtet auf CPU) Eine static Methode, beeinflusst nur den momentan laufenden Thread (ein Beispiel) Die Unterschied zwischen den Methode yield() und Methode suspend() Nach der yield() Methode bleibt der Thread original runnable Zustand, nicht wie bei der die suspend() Methode: der Thread verändert sich in einem suspend Zustand Was passiert, wenn yield() ausgeführt wird? Es kann ein anderer Thread mit gleicher Priorität ausgeführt werden. Wenn es keinen Thread in Wartliste gibt, wird der Thread fortgesetzt. Andere Thread-Scheduling Methoden Die Methode yield()
Andere Thread-Scheduling Methoden Ein Beispiel mit der Methode yield() public class YieldApplet extends Applet implements Runnable{ Thread t; public void init() { t=new Thread(this); } public void paint (Graphics g){ t.yield(); } }
Andere Thread-Scheduling Methoden Wie realisiert die Methode yield() static void yield() Thread1 (pri. 5) Thread2 (pri. 5) . . . Thread n (pri. 5) Thread1 (pri. 5) currently running Thread Warteliste mit gleicher Priorität
Andere Thread-Scheduling Methoden Die Methode Daemon() • Daemon Threads • void setDaemon(boolean b) • Wenn b true ist, ist das Thread als ein daemon-Thread ; • wenn b false ist, ist das Thread als ein user-Thread • boolean isDaemon() • Wenn das Thread ein daemon-Thread ist, gibt true zuruck; • wenn ein user-Thread ist, gibt false zurück
Zusammenfassung Zusammenfassung • Alle Methoden in diesem Kapitel : • void setPriority(int priority); • int getPriority(); • void suspend(); • void resume(); • static void yield(); • void setDaemon(boolean b) ; • booleanisDaemon() ;