これに関する質問はすでにカバーされていることは知っていますが(例 https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads )、私は次のようには感じません私は満足のいく答えを得ました。
問題は、JVMがグリーンスレッドをサポートしないのはなぜですか?
緑のスレッドは、すべてのコードが単一のオペレーティングシステムスレッドで実行されるJava仮想マシン(JVM)の動作モードを指します。
そしてこれは Java.Sun.com にあります:
欠点は、グリーンスレッドを使用すると、Linuxのシステムスレッドが利用されないため、Java仮想マシンは、CPUが追加されたときにスケーラブルではないということです。
JVMはコアの数と同じ数のシステムプロセスのプールを持つことができ、その上でグリーンスレッドを実行できるように思えます。これは、頻繁にブロックする非常に多数のスレッドがある場合に、いくつかの大きな利点を提供する可能性があります(主に現在のJVMがスレッド数を制限しているため)。
考え?
JVMがグリーンスレッドを放棄してネイティブスレッドに移行したことを覚えています。これは、2つの単純な理由によるものでした。グリーンスレッドは率直に言ってゴミであり、Sunで利用できる開発者の努力は限られており、マルチコアプロセッサをサポートする必要がありました。
これは残念なことでした。緑色のスレッドは、はるかに優れた抽象化を提供し、同時実行性が障害物ではなく便利なツールになることを可能にします。しかし、いくつかのハードルを克服できない場合、グリーンスレッドは役に立ちません。
利用可能なすべてのCPUコアを使用する必要がある
コンテキスト切り替えは安価でなければなりません
I/Oはそれに関与しているすべてのスレッドをブロックする可能性がありますが、他のすべてのスレッドではなくない他のすべてのスレッドではありません。これは、一部の初期の実装ではそうでした。
Javaでマルチスレッドがそれほど難しいのはなぜかと疑問に思っていましたが、次第に明確になりました。最終的には、次のネイティブスレッドへの切り替えに関係しています。
すべてのCPUコアの使用が得意
完全に並行していて、独立したI/Oなどを提供するのが得意
コンテキストの切り替えが遅い(最高のグリーンスレッド実装と比較して)
ひどく貪欲なメモリのため、それらの最大使用可能数を制限する
もちろん、非常に並行性の高い、現実の世界を表現するための根拠の不十分な抽象化。
今日、lotのプログラマ時間は、ノンブロッキングI/Oやフューチャーなどのコーディングに入るようになりました。より良いレベルの抽象化。
比較のために、Erlangに加えて、新しい Go 言語は非常に優れた並行性を発揮します。それらの祖父はすべて残っています Occam 、まだ進行中の研究プロジェクト。
複数のスレッドを偽装する単一のプロセスには多くの問題があります。それらの1つは、すべての偽のスレッドがページ違反で停止することです。
提案する代替策であるプロセスのプールには、いくつかの利点と欠点があります。最大の利点である「スレッド」の分離は、実際にはあまりここにありません。ここでの大きな欠点は、実装が極端に困難で、同期の効率が悪いことです。
ただし、スレッドのプールのように使用できる(ただし、より多くの分離が必要な)プロセスのプールが優れたものになる(Javaではない)アプリケーションがいくつか存在することにも同意します。スレッドはほとんどすべてを共有します。プロセスを使用すると、具体的に何を共有するかを選択できます。私の知る限り、まだ実装に取り組んでいる人はいません。
平均的なメリットはまったくありませんJavaコード。JavaはErlangではなく、JavaプログラマーはErlangプログラマーと同じ考え方ではなく、この言語をこのように使用することを意図したものではありません。
真の軽量プロセスが必要な場合-Erlangを使用して、メッセージを介して通信する数千のスレッドを作成します。 Javaでは、ミューテックスとセマフォと共通のメモリを共有する数十のスレッドがあります。これは、異なる問題のセット用に設計された、単なる異なるプログラミングモデルです。