Ich möchte die Vorteile dieser Art von Threads verstehen.
In welchen Umgebungen sind grüne Fäden besser als nicht grüne? Einige sagen, grüne Threads seien besser für Multi-Core-Prozessoren.
Alle erwarteten Verhaltensprobleme.
Ich möchte die Vorteile dieser Art von Threads verstehen.
In welchen Umgebungen sind grüne Fäden besser als nicht grüne? Einige sagen, grüne Threads seien besser für Multi-Core-Prozessoren.
Alle erwarteten Verhaltensprobleme.
Antworten:
Der Wikipedia-Artikel Green Threads erklärt es sehr gut.
Grüne Threads sind "Threads auf Benutzerebene". Sie werden von einem "normalen" Prozess auf Benutzerebene geplant, nicht vom Kernel. Sie können also verwendet werden, um Multithreading auf Plattformen zu simulieren, die diese Funktion nicht bieten.
Insbesondere im Kontext von Java gehören grüne Threads der Vergangenheit an. Siehe Artikel JDK 1.1 für das Solaris-Entwicklerhandbuch . (Es geht um Solaris, aber die Tatsache, dass keine grünen Threads mehr verwendet werden, gilt für die üblichen Plattformen.)
Grüne Threads wurden in der Sun JVM für Linux ab der Veröffentlichung von Version 1.3 aufgegeben (siehe Java [tm] -Technologie auf der Linux-Plattform auf archive.org). Das geht auf das Jahr 2000 zurück. Für Solaris waren native Threads ab JDK 1.2 verfügbar. Das geht auf das Jahr 1998 zurück. Ich glaube nicht, dass es jemals eine Green-Thread-Implementierung für Windows gegeben hat, aber ich kann keine Referenz dafür finden.
Es gibt einige Ausnahmen, wie im Wikipedia-Artikel erwähnt, die ich hauptsächlich für Geräte mit geringem Stromverbrauch (eingebettete Geräte) sammle.
Grüne Threads sind Threads, die auf Anwendungsebene und nicht im Betriebssystem implementiert sind. Dies geschieht normalerweise, wenn das Betriebssystem keine Thread-API bereitstellt oder nicht wie gewünscht funktioniert.
Der Vorteil ist also, dass Sie überhaupt eine threadähnliche Funktionalität erhalten. Der Nachteil ist, dass grüne Threads nicht mehrere Kerne verwenden können.
Es gab einige frühe JVMs, die grüne Threads verwendeten (IIRC, der Blackdown-JVM-Port für Linux), aber heutzutage verwenden alle Mainstream-JVMs echte Threads. Möglicherweise gibt es einige eingebettete JVMs, die noch grüne Threads verwenden.
Der grüne Thread-Speicher wird vom Heap zugewiesen, anstatt dass vom Betriebssystem ein Stapel dafür erstellt wird. Dies kann möglicherweise zu einer Größenordnung oder mehr Zunahme gleichzeitiger Threads führen. Wie bereits erwähnt, werden mehrere Prozessoren nicht automatisch genutzt. Der Anwendungsfall besteht jedoch normalerweise darin, E / A zu blockieren. Beispielsweise können Sie mit grünen Threads 100.000 gleichzeitige Verbindungen im Gegensatz zu 10.000 verarbeiten.
Mit anderen Worten, grüne Threads sind in einem bestimmten Maßstab besser für E / A-gebundene Operationen.
Grüne Threads sind erheblich schneller als native Threads, wenn sie aktivere Threads als Prozessoren haben.
Java hatte anfangs Unterstützung für Green Threads, konnte jedoch im Gegensatz zu den meisten modernen Green Threading-Implementierungen nicht über mehrere Prozessoren skaliert werden, sodass Java nicht in der Lage war, mehrere Kerne zu verwenden.
Dann entfernte Java grünes Threading, um sich nur auf native Threads zu verlassen. Das machte Java-Threads langsamer als grüne Threads.
Bitte beachten Sie, dass ich nicht speziell über die Java-Implementierung von Green Threads spreche, die Nachteile hatten, da sie im Gegensatz zu anderen Green Thread-Implikationen in einem Multicore- oder Multiprozessorsystem nicht skaliert werden konnten.
Grüne Threads sind Threads auf Benutzerebene und keine Threads auf Kernelebene. Sie werden eher von Benutzerbibliotheken als vom Kernel geplant. Sie können über einen eigenen Planungsmechanismus verfügen, um Threads zu planen, anstatt sich auf den OS-Scheduler zu verlassen.
Grüne Threads emulieren Multithread-Umgebungen, ohne auf native Betriebssystemfunktionen angewiesen zu sein, und sie werden im Benutzerbereich anstelle des Kernelbereichs verwaltet, sodass sie in Umgebungen arbeiten können, die keine native Thread-Unterstützung bieten
Leistung:
Auf einem Multi-Core-Prozessor können native Thread-Implementierungen automatisch mehreren Prozessoren Arbeit zuweisen, während Green-Thread-Implementierungen dies normalerweise nicht können. Grüne Threads übertreffen native Linux-Threads bei der Thread-Aktivierung und -Synchronisation erheblich.
Wenn ein grüner Thread einen blockierenden Systemaufruf ausführt, wird nicht nur dieser Thread blockiert, sondern alle Threads innerhalb des Prozesses werden blockiert.
Grüne Threads werden vom Betriebssystem nicht geplant.
Das bedeutet, dass die Planung für sie im Benutzerbereich erfolgt und nicht vom Kernel verwaltet wird. Dies bedeutet, dass die grünen Threads normalerweise nicht alle CPU-Kerne verwenden können.
Für jede Mainstream-Plattform, auf der heutzutage Java ausgeführt wird (z. B. x86 oder x64), werden echte Threads verwendet.
JAVA Multi-Threading wird von zwei Modellen implementiert:
Green Thread-Modell: Der Thread, der von JVM verwaltet wird, ohne die zugrunde liegende Betriebssystemunterstützung zu übernehmen, wird als Green Thread bezeichnet. Nur wenige Betriebssysteme wie Sun Solaris unterstützen das Green-Thread-Modell. Es ist veraltet und wird nicht empfohlen.
Native OS-Modell: Der Thread, der von der JVM mithilfe des zugrunde liegenden Betriebssystems verwaltet wird, wird als Native OS-Modell bezeichnet. Alle Windows-Betriebssysteme unterstützen das native Betriebssystemmodell.