Computer graphics & visualization Procedural Terrain Generation Hager Simon Proseminar Gamedesign.
Java Threads Scheduling Lei Chen November 2000 Proseminar.
-
Upload
huncberct-redder -
Category
Documents
-
view
108 -
download
0
Transcript of Java Threads Scheduling Lei Chen November 2000 Proseminar.
Java Threads Java Threads SchedulingScheduling
Lei ChenNovember 2000
Proseminar
Jave Thread Scheduling
Popular--Scheduling Implementierung
Native--Scheduling Unterstützung
Andere Thread--Scheduling Methoden
Zusammenfassung
Teil I
Popular-Scheduling Implementierung
1. Green ThreadsWas ist ein Green-Threads-ModellGreen Threads sind Benutzer-Ebene-ThreadsJeder Zeit darf einen einzigen Thread ausführenGreen-Threads-Scheduling
Wann wechselt die virtuelle Maschine den laufenden Thread?Für Implementierung von Green-Threads wird empfohlen, Priorität Vererbung zu benutzenWas 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
Was ist ein Green-Threads Modell
Processor
Betrie
bssyste
m(B
S)
JVM
BS-Thread
BS-Thread
BS-Thread
Java-Thread
Java-Thread
Stack
Programmzähler
BookkeepingInfo.
… …
StackProgramm
zählerBookkeeping
Info.
JVM: Java Virtuelle Maschine
Threads auf Benutzer- und System-Ebene Threads
Meisten Betriebssysteme haben zwei logische Teile: System-Ebene und Benutzer-EbeneWas ist ein Systemaufruf
Ein Systemaufruf Beispiel
Vor- und Nachteil von dieser logischen Teilung
Vorteil: Schutz von BenutzerfehlerNachteil: Aufruf des Betriebssystems
Popular—Scheduling Implementierung
Ein Systemaufruf Beispiel
Ein Programm
Der Kern des Betriebssystem
Datei
Benutzer
Ebene
System
Ebene
Systemaufr
uf
lesen
Popular—Scheduling Implementierung
Benutzer-Ebene und System-Ebene
Betriebssystem
Benutzer-Ebene System-Ebene
BS-Threads verwaltet ohne Systemaufrufe
BS-Thread werdenim BS-Kern verwaltet
Beispiele
Popular—Scheduling Implementierung
BS-Threads auf Benutzerebene
JVM
Der Kern des Betriebssystem
Datei
Benutzerebene
Systemebenelesen
Popular—Scheduling Implementierung
BS-Bibliotheken
Anwendungsebene
BS-Ebene
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
Ein Implementierungsbeispiel von green-Threads-Scheduling
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-ThreadsFür jeden Java-Thread gibt es einen entsprechenden Thread vom Betriebssystem Jeder Windows-Native-Thread kann als ein Prozeß angesehen werdenVerschiedene Implementierung der Java Virtuelle Maschine auf den Windows PlattformenSchwierigkeit der Windows native Threads ImplementierungViele Threads dürfen gleichzeitig in vielen CPUs ausführen
Popular--Scheduling Implementierung
Windows-Native-Threads (2)
Windows-Native-Threads SchedulingAbbildungstabelle von Java-Thread Priortäten auf Win32- Plattform
7 Windows Threads Prioritäten für 11 Java Threads Prioritäten5 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)
Java-Priorität Windows 95/NT Priorität
0 THREAD_PRIORITY-IDLE
1 (Thread.MIN_PRIORITY) THREAD_PRIORITY-LOWEST
2 THREAD_PRIORITY-LOWEST
3 THREAD_PRIORITY-BELOW_NORMAL
4 THREAD_PRIORITY-BELOW_NORMAL
5 (Thread.NORM_PRIORITY) THREAD_PRIORITY-NORMAL
6 THREAD_PRIORITY-ABOVE_NORMAL
7 THREAD_PRIORITY-ABOVE_NORMAL
8 THREAD_PRIORITY-HIGHEST
9 THREAD_PRIORITY-HIGHEST
10 (Thread.MAX_PRIORITY) THREAD_PRIORITY-TIME-CRITICAL
Popular--Scheduling Implementierung
3. Solaris-Native-ThreadsEs ist ein Zwei-Ebenen-Modell:
Benutzerebene-Threads-Modell: dem Betriebssystemkern unbekanntSystem-Ebene-Threads (LWPs, lightweight processes) : dem Betriebssystemkern bekanntViele Threads in vielen CPUs dürfen gleichzeitig ausführen
Scheduling-Implementierung des Solaris-Native-ThreadsDas Betriebssystem gíbt jedem LWP einen timesliceDie Wirkung des timeslice(4 Beispiele)wieviele LWPs(Lightweight-Process) hat die virtual Maschine?
Die virtuelle Maschine beginnt immer mit einem LWPWenn 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
Popular--Scheduling Implementierung
Solaris-Native-Threads Modell
Processor
JVM
SolarisThread
SolarisThread
JavaThread
JavaThread
……
JVM: Java Virtuelle Maschine
Processor
…
LWP
LWP
Anwendung BS BS-Kern
…
Priority-based
Not timesliced
timesliced
Die Wirkung der timeslice in Solaris-Native-Threads-Modell
LWP1 LWP2
Solaris-Thread1mit
Priorität 5
LWP: lightweight processes
Beispiel1
Syste
m-
Eb
en
e
Solaris-Thread2mit
Priorität 5
Solaris-Thread3mit
Priorität 5
Die Wirkung der timeslice in Solaris-Native-Threads-Modell
LWP1 LWP2
LWP: lightweight processes Beispiel
2
Syste
m-
Eb
ene
Solaris-Thread1mit
Priorität 5
Solaris-Thread2mit
Priorität 6
Solaris-Thread3mit
Priorität 4
Teil 2
Native-Scheduling-Unterstützung
Anbindung von Native Scheduling in Java
Realisierung durch Klasse CPUSupportImplementeriungen für Solaris und Windows
Native-Scheduling-Unterstützung
Die Unterstützung von native scheduling
Class CPUSupportpublic 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“); } } }
Native-Scheduling-Unterstützung
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
Eine Übersicht über andere Thread-scheduling Methoden
Die Methode suspend() und resume() void suspend() (nicht von Java2 unterstützt):Verhindern ein Thread am unendlichen Laufenvoid resume() (nicht von Java2 unterstützt):Erlauben einem Thread nach suspend wieder zu laufenDer suspended Zustand ist nicht gleich dem blockierten Zustand
Eine Anwendung mit den Methoden suspend() und resume()
Andere Thread-Scheduling Methoden
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();
}
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
}
}
Eine Anwendung mit den Methoden suspend() und
resume()
Die Methode yield() 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
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()
Thread1(pri. 5)
Thread2(pri. 5)
Thread n(pri. 5)
Thread1(pri. 5)
static void yield()
currently running Thread
Warteliste mit gleicher Priorität
. . .
Andere Thread-Scheduling Methoden
Die Methode Daemon()
Daemon Threadsvoid 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
Andere Thread-Scheduling Methoden
Zusammenfassung
Alle Methoden in diesem Kapitel :
void setPriority(int priority) ;int getPriority() ;void suspend() ;void resume() ; static void yield() ;void setDaemon(boolean b) ;boolean isDaemon() ;
Zusammenfassung