Grüne Fäden gegen nicht grüne Fäden

79

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.

Toter Programmierer
quelle
5
Es ist äußerst unwahrscheinlich, dass grüne Threads für Mehrkernprozessoren besser sind, da sie nicht mehr als einen Kern verwenden. Wenn grüne Threads besser sind, haben Sie ein Programm, das keine Threads verwenden sollte (manchmal werden Threads verwendet, wenn sie nicht verwendet werden sollten)
Peter Lawrey
1
Wo sollten keine Threads verwendet werden?
user1657170

Antworten:

81

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.

Matte
quelle
8
Eine Sache der alten Vergangenheit. Letztes Jahrhundert. Ihr Professor muss auf dem neuesten Stand sein.
user207421
1
@ user1657170: was waren sie nicht? Welche "Assisted Threading" -Technologie erwähnen Sie?
Mat
2
@ user1657170: Ich verstehe immer noch nicht, worauf Sie sich in dem beziehen, was ich oben geschrieben habe. Lesen Sie den Artikel, auf den ich von Ex-Sun verlinkt habe. Sie haben grüne Threads um Solaris 2.6 aufgegeben.
Mat
4
@ user1657170: Fasern (und all die verwandten / ähnlichen Dinge, die heutzutage auf so ziemlich allen Plattformen aufgetaucht sind oder im Wesentlichen für immer da waren wie in Erlang-Prozessen) haben nichts mit grünen Threads zu tun, wie der Begriff in Java verwendet wurde. Natürlich hat Sun / Oracle native Threads, und natürlich verwendet die JVM diese. Wenn Sie auf etwas Spezielles hinweisen möchten, das oben sachlich falsch ist, geben Sie bitte genaue Quellen an.
Mat
3
Wie nennen Sie die drei Links in dem, was ich oben gepostet habe, insbesondere den Link zu Oracle-Dokumenten, der dem widerspricht, was Sie ohne Referenz zu dieser Frage gepostet haben? Ich beantworte Ihre Kommentare übrigens nicht mehr, das ist reine Zeitverschwendung.
Mat
22

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.

Michael Borgwardt
quelle
17
Es gibt verschiedene Implementierungen von grünen Threads, die mehrere native Threads verwenden, um eine Multi-Core- oder Multiprozessor-Architektur zu verwenden. Dazu gehören die Threading-Bibliothek in .NET und die Quasar-Bibliothek für Java. Beide verwenden so viele native Threads, wie Kerne vorhanden sind, und verwenden grüne Threads / Fasern für zusätzliche Threads, um sie zwischen den nativen Threads auszugleichen.
user1657170
22

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.

Yike Lu
quelle
3
Mit grünen Threads haben Sie nicht wirklich 100.000 gleichzeitige Verbindungen. Es ist nur eine Illusion .
Pacerier
7
Technisch gesehen wären die Verbindungen gleichzeitig, Sie können ihre Anforderungen einfach nicht gleichzeitig verarbeiten.
Yike Lu
Die Position des Stapels führt nicht auf magische Weise zu einer Beschleunigung.
user207421
Wie lassen grüne Threads die Ergebnisse einer gleichzeitigen 100.000-Verbindung auf Client-Bildschirmen erscheinen? Das ist eine ziemliche Illusion? Könnten wir das wiederholen, wenn 3D-Grafiken als Illusion auf dem Bildschirm angezeigt werden, während der Code sie nicht erzeugt?
user1657170
5

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.

user1657170
quelle
Grüne Threads sind für rechenintensive Aufgaben nicht wesentlich schneller, wenn überhaupt schneller. Es ist jedoch ein großartiges Werkzeug für bestimmte Aufgaben.
JugsteR
Ja, sind Sie. Sie können nicht schneller rechnen, aber sie können schneller einfädeln. Sie bieten keine Parallelität wie echte Laufflächen. Die meisten Fälle von Threading beinhalten keine computerintensiven Aufgaben. Obwohl Sie vielleicht argumentieren, dass Leute Threads überbeanspruchen und vielleicht mehr Zustandsmaschinen verwenden und das, was sie tun, in die prozedurale Programmierung einpassen sollten.
user1657170
Es wurde kein Kontext angegeben, bitte nehmen Sie nichts an. Wenn Sie grüne Threads auf einer beliebigen Anzahl von CPUs ausführen können, genau wie bei "normalen" Threads, bedeutet rechenintensives Rechnen in diesem Fall, dass kein Umschalten stattfindet. Da es keine Umschaltung gibt, wird der Vorteil der Verwendung von grünen Fäden für solche Zwecke zunichte gemacht. Es tut mir leid, wenn das unklar war. Nein, grüne Fäden in dem speziellen Szenario, über das ich gesprochen habe, bieten Ihnen keine nennenswerten Leistungsvorteile.
JugsteR
4

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.

Aniket Thakur
quelle
1
Wie werden alle grünen Fäden im Prozess blockiert? Was ist, wenn dieser Prozess mehrere Kernel-Threads und einen Executor-Service hat, um grüne Threads darauf zu versenden? Was ist, wenn der Thread, der den Syscall ausführt, einfach keine anderen Aufgaben an ihn sendet? Ihre Behauptung gilt nur in einer Umgebung mit einem Thread.
März
2
Was ich damit gemeint habe ist, dass es 1 Kernel-Thread für n grüne Threads eines Prozesses gibt und 1 grüner Thread einen Blockierungsaufruf ausführt (den der einzelne Kernel-Thread verarbeitet), dann wird der gesamte grüne Thread, der diesem Kernel-Thread entspricht, blockiert. Offensichtlich gilt dies nicht für m Kernel-Threads, die für einen Prozess n grünen Threads zugeordnet sind. In beiden Fällen kann man nicht sagen, dass es sich um eine Single-Thread-Umgebung handelt - dies hängt von der Kernel-Thread-Planung ab.
Aniket Thakur
2

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.

kittylyst
quelle
3
Es gibt keinen Grund, warum grüne Threads nicht mehrere CPUs verwenden können. Siehe zum Beispiel GHC und Go.
Rechtsfalte
2

JAVA Multi-Threading wird von zwei Modellen implementiert:

  1. Grünes Fadenmodell
  2. Natives Betriebssystemmodell

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.

Raman Gupta
quelle