it-swarm-eu.dev

Warum nicht grüne Fäden?

Obwohl ich weiß, dass Fragen dazu bereits behandelt wurden (z. B. https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), habe ich keine Lust darauf Ich habe eine zufriedenstellende Antwort.

Die Frage ist: Warum unterstützt JVM keine grünen Threads mehr?

Dies steht auf dem Code-Stil Java FAQ :

Ein grüner Thread bezieht sich auf eine Betriebsart für die Java Virtual Machine (JVM)), in der der gesamte Code in einem einzelnen Betriebssystem-Thread ausgeführt wird.

Und das vorbei auf Java.Sun.com :

Der Nachteil ist, dass die Verwendung von grünen Threads bedeutet, dass System-Threads unter Linux nicht ausgenutzt werden. Daher ist die virtuelle Maschine Java) nicht skalierbar, wenn zusätzliche CPUs hinzugefügt werden.

Es scheint mir, dass die JVM einen Pool von Systemprozessen haben könnte, der der Anzahl der Kerne entspricht, und dann darüber grüne Threads ausführen könnte. Dies kann einige große Vorteile bieten, wenn Sie eine sehr große Anzahl von Threads haben, die häufig blockieren (hauptsächlich, weil die aktuelle JVM die Anzahl der Threads begrenzt).

Gedanken?

34
redjamjar

Ich erinnere mich, dass die JVM grüne Threads aufgegeben und zu nativen Threads gewechselt hat. Dies hatte zwei einfache Gründe: Die grünen Fäden waren offen gesagt Müll, und es bestand die Notwendigkeit, Multi-Core-Prozessoren mit dem begrenzten Entwickleraufwand zu unterstützen, der bei Sun verfügbar ist.

Dies war eine Schande - grüne Threads bieten eine weitaus bessere Abstraktion, sodass Parallelität ein nützliches Werkzeug und kein Stolperstein ist. Grüne Fäden nützen jedoch nichts, wenn mehrere Hürden nicht überwunden werden können:

  • sie müssen alle ihnen zur Verfügung stehenden CPU-Kerne verwenden

  • kontextwechsel muss billig sein

  • E/A kann jeden darin beteiligten Thread blockieren, aber keinen anderen Thread und schon gar nicht alle anderen Threads, was in einigen frühen Implementierungen der Fall war.

Ich habe mich oft gefragt, warum Multithreading in Java] so schwierig ist, aber jetzt wird es klarer - es hatte letztendlich mit dem Wechsel zu nativen Threads zu tun:

  • gut in der Verwendung aller CPU-Kerne

  • gut darin, wirklich gleichzeitig zu sein, unabhängige E/A usw. bereitzustellen

  • langsam beim Kontextwechsel (im Vergleich zu den besten Green-Thread-Implementierungen)

  • schrecklich gierig nach Gedächtnis, wodurch die maximal nutzbare Anzahl von ihnen begrenzt wird

  • eine schlechte Abstraktion für jede Grundlage, um die reale Welt auszudrücken, was natürlich sehr gleichzeitig ist.

Heutzutage wird eine Menge Programmiererzeit in das Codieren von nicht blockierenden E/A, Futures usw. investiert. Es ist eine große Schande, dass wir keine haben bessere Abstraktionsebene.

Zum Vergleich: Neben Erlang leistet die neue Sprache Go gute Arbeit bei großer Parallelität. Der Großvater von allen bleibt Occam , immer noch ein laufendes Forschungsprojekt.

29
Rick-777

Ein einzelner Prozess, der mehrere Threads fälscht, hat viele Probleme. Eine davon ist, dass alle gefälschten Threads bei jedem Seitenfehler zum Stillstand kommen.

Die von Ihnen vorgeschlagene Alternative, ein Pool von Prozessen, hat einige Vor- und einige Nachteile. Der größte Vorteil, die Isolierung der "Fäden", würde Sie hier wirklich nicht viel bringen. Der große Nachteil, die extreme Schwierigkeit der Implementierung und die weniger effiziente Synchronisation sind hier der Deal-Killer.

Ich stimme jedoch zu, dass es einige Anwendungen gibt (nicht Java), in denen ein Pool von Prozessen, die Sie wie einen Pool von Threads verwenden könnten (aber mit mehr Isolation), eine großartige Sache wäre. Threads teilen so ziemlich alles. Bei Prozessen können Sie gezielt auswählen, was freigegeben werden soll. Meines Wissens hat sich noch niemand die Mühe gemacht, es umzusetzen.

15
David Schwartz

Für einen durchschnittlichen Java Code. Java ist nicht Erlang, und Java Programmierer sind es überhaupt nicht) gibt es überhaupt keinen Vorteil nicht in der gleichen Denkweise wie Erlang-Programmierer. Die Sprache sollte niemals auf diese Weise verwendet werden.

Wenn Sie den wirklich leichten Prozess wollen, verwenden Sie Erlang und erstellen Sie Tausende von Threads, die über Nachrichten kommunizieren. In Java) haben Sie ein Dutzend Threads, die einen gemeinsamen Speicher mit Mutexen und Semaphoren teilen. Es ist nur ein anderes Programmiermodell, das für eine andere Reihe von Problemen entwickelt wurde.

14
SK-logic