11.11 | Umsetzung von Java-Threads im Betriebssystem |
Die Implementierung von Java-Threads auf einem bestimmten Betriebssystem ist ein wichtiger Aspekt bei der Konstruktion einer Virtual Machine. Bei Betriebssystemen, die von Haus aus über Threads verfügen (so wie z. B. Solaris oder Windows NT/2000/XP), ist es prinzipiell möglich, Java-Threads direkt auf das Betriebssystem abzubilden. Auf anderen Plattformen bediente man sich in der Vergangenheit zum Teil der so genannten »Green Threads«.
Diese Umsetzung von Java-Threads auf das Betriebssystem hat sich im Lauf der Zeit teilweise geändert. So kamen auf Solaris bis JDK-Version 1.1 und auf Linux bis JDK-Version 1.2 noch Green Threads zum Einsatz. Mittlerweile werden hier native Threads benutzt.
Green Threads sind simulierte Threads innerhalb des Virtual-Machine-Prozesses. Sie werden in der Virtual Machine selbst realisiert, wohingegen native Threads auf Funktionen des Betriebssystems beruhen.
Der Vorteil des Green-Thread-Ansatzes ist eine geringere Abhängigkeit gegenüber den Thread-Bibliotheken der verschiedenen UNIX-Derivate und damit eine bessere Portierbarkeit. Der große Nachteil der Green Threads ist allerdings eine schlechte Skalierbarkeit, da alle simulierten Threads innerhalb des gleichen Betriebssystemprozesses laufen und vom Betriebssystem nicht auf verschiedene Prozessoren zur gleichzeitigen Ausführung verteilt werden können. Die Performance von Applikationen skaliert daher nicht mit der Anzahl der Prozessoren. Auch das Scheduling kann bei Green-Thread-Implementierungen nicht vom Betriebssystem übernommen werden und muss von der Virtual Machine durchgeführt werden. Das Scheduling-Verhalten war dabei aber oftmals nicht zufriedenstellend, wie bereits im Abschnitt 11.4 beschrieben wurde.
Bei einer Virtual Machine, die Java-Threads auf native Threads im Betriebsystem abbildet, ist die Skalierbarkeit dagegen deutlich besser. Hier kann der Betriebssystem-Kernel auf Multiprozessor-Systemen die Java-Threads auf verschiedene Prozessoren verteilen, wodurch die Threads echt parallel ablaufen. Auch das Scheduling kann direkt im Betriebssystem erfolgen.
Derzeit werden Java-Threads folgendermaßen unter Windows, Solaris und Linux implementiert:Für Entwickler hat die Ablösung der Green-Thread-Implementierungen den Vorteil, dass die im Abschnitt 11.4 geschilderten Plattformabhängigkeiten im Scheduling-Verhalten beseitigt wurden. Bei den aktuellen Virtual Machines wechseln sich die rechenwilligen Threads bei der CPU-Zuteilung ständig ab, so dass parallele Programme »runder« laufen.
- Unter Windows NT/2000/XP werden Java-Threads auf Threads im Betriebssystems abgebildet, die innerhalb des Virtual-Machine-Prozesses ablaufen. Die Anzahl der gestarteten Prozesse und Threads kann auf dieser Plattform gut im Task-Manager beobachtet werden. Beim Starten eines Java-Programms sieht man, dass sich die Anzahl der Prozesse um Eins erhöht, die Anzahl der Threads nimmt dagegen stärker zu. Dies ist auch dann der Fall, wenn das Programm selbst keine eigenen Threads erzeugt, weil die Virtual Machine eigene System-Threads für Aufgaben wie Garbage Collection startet.
- Bei Solaris werden seit JDK-Version 1.2 die nativen Threads eingesetzt. In den Vorversionen machte die Solaris-Virtual Machine von Green Threads Gebrauch.
- Unter Linux werden Threads seit JDK-Version 1.3 mit abgespalteten Tochterprozessen realisiert. Zuvor wurden auch hier Green Threads verwendet. Dadurch, dass für Java-Threads komplette Prozesse erzeugt werden, kann die Erzeugung einer großen Anzahl neuer Threads länger dauern als bei Betriebssystemen, auf denen native Threads eingesetzt werden.