これに関する質問はすでにカバーされていることは知っていますが(例: https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads )、満足のいく答えが得られたとは思えません。

質問は次のとおりです。 JVMがグリーンスレッドをサポートしなくなったのはなぜですか?

コードスタイルのJavaFAQ にこれが記載されています:

グリーンスレッドは、すべてのコードが単一のオペレーティングシステムスレッドで実行されるJava仮想マシン(JVM)の操作モードを示します。

これは java.sun.com で終わります:

グリーンスレッドを使用すると、Linux上のシステムスレッドが利用されないため、CPUが追加されてもJava仮想マシンがスケーラブルにならないという欠点があります。

JVMは、コアの数に等しいシステムプロセスのプールを持ち、その上でグリーンスレッドを実行できるように思われます。これは、頻繁にブロックするスレッドの数が非常に多い場合に、いくつかの大きな利点を提供する可能性があります(主に、現在のJVMがスレッドの数を制限しているためです)。

考え?

コメント

  • 私には、質問は次のように思われます:なぜグリーンスレッドなのか?複数のプロセスを介してJVMレベルでエミュレートすることによってマルチスレッドを再導入するのはなぜですか?'プログラマーがスレッドの生成に寛大になることを許可する以外に、一見利益がないように見えるための多くの苦痛とオーバーヘッド(そして私は'が'の利点)。
  • そうですね、'は、拡張可能な並行プログラミングモデルを用意することについてです。現在、Javaでは、スケーラビリティが必要な場合独自のスレッドプールを使用してNIOに切り替えます。少なくとも、'私の理解です。
  • < akka.io >どのサポートrts軽量スレッドも必要があると思います。実際、ここでかなり良い議論が見つかりました< stackoverflow.com/questions/7458782/ … >
  • @delnanネイティブスレッドのコンテキストスイッチにはコストがかかるため。グリーンスレッドは、コンテキストスイッチとプロセス間同期のオーバーヘッドがはるかに少なくなります。さらに、グリーンスレッドの量は実質的に無制限ですが(VMプロセスにあまりストレスをかけずに数十万になる可能性があります)、ネイティブスレッドの量はOSとメモリのオーバーヘッドによって制限されます。
  • JVMがネイティブスレッドを直接サポートするまでには長い時間がかかりました。それまではグリーンスレッドが中間的な解決策でした。

回答

JVMがグリーンスレッドを放棄し、次の場所に移動したことを覚えています。ネイティブスレッド。これは2つの単純な理由によるものでした。グリーンスレッドは率直に言ってごみであり、Sunで利用できる開発者の努力が限られているマルチコアプロセッサをサポートする必要がありました。

これは残念でした。グリーンスレッドははるかに優れた抽象化により、並行性を障害ではなく便利なツールにすることができます。ただし、いくつかのハードルを克服できない場合、グリーンスレッドは役に立ちません。

  • 利用可能なすべてのcpuコアを使用する必要があります

  • コンテキストの切り替えは安価である必要があります

  • I / Oは、それに関与するスレッドをブロックできますが、他のスレッドや他のすべてのスレッドをブロックすることはできません。 、これは一部の初期の実装に当てはまりました。

Javaでマルチスレッドが非常に難しいのはなぜかとよく思っていましたが、今では明らかになっています。最終的にはネイティブスレッドへの切り替えに関係します。これは次のとおりです。

  • すべてのcpuコアの使用に長けている

  • 真に優れている同時、独立したI / Oなどを提供

  • コンテキストの切り替えが遅い(最高のグリーンスレッドの実装と比較して)

  • ひどくメモリに貪欲であるため、使用可能な最大数が制限されます

  • 現実世界を表現するための基礎としての抽象化は不十分であり、もちろん非常に同時です。

最近では、 プログラマーの時間の多くは、ノンブロッキングI / O、先物などのコーディングに費やされています。これ以上の抽象化レベルがないのは「非常に残念です」。

比較すると、Erlangの他に、新しい Go 言語は非常に高い同時実行性を実現します。それらの祖父はすべてオッカムのままであり、現在も進行中の研究プロジェクトです。

コメント

  • 投稿してからどれだけ進んだか:O
  • 残念ながら、Rustは、より優れた並行性の抽象化を放棄したもう1つの言語です。彼らも協力スレッドからネイティブスレッドに移行することを決定しました。
  • @ Rick-777Rustは低レベルすぎてそれを実行できません。

回答

複数のスレッドを偽造する単一のプロセスには多くの問題があります。そのうちの1つは、すべての偽のスレッドがページフォールトで停止することです。

提案する代替案であるプロセスのプールには、いくつかの長所と短所があります。最大の利点である「スレッド」の分離は、ここではあまり得られません。大きな欠点である実装の極端な難しさと同期の効率の低下は、ここでの取引のキラーです。

ただし、私はスレッドのプールのように使用できる(ただし、より分離された)プロセスのプールが必要なアプリケーション(Javaではない)がいくつか存在することに同意します。スレッドはほとんどすべてを共有します。プロセスを使用すると、次のことができます。具体的に何を共有するかを選択します。私の知る限り、まだ誰もそれを実装する努力をしていません。

コメント

  • Occamはこれを提供すると主張しています。 ' 80年代には重要な言語でしたが、開発資金の不足に悩まされ、その結果、研究のニッチになりました。しかし、並行性に関するそのアイデアは、当時と同じくらい堅実です。まだ改善されていません。
  • "マルチスレッドの場合" al golang(" M:N "タイプのスケジューリング)場合、理論的には、他のスレッドが可能であるため、1つのグリーンスレッドのみがページフォールトによってブロックされます。 "たるみを取ります"(他のグリーンスレッド)… softwareengineering.stackexchange.com/questions/222642/ …

回答

平均的なJavaコードにはまったくメリットがありません。 JavaはErlangではなく、JavaプログラマーはErlangプログラマーと同じ考え方ではありません。この言語は、このように使用されることを意図したものではありませんでした。

真の軽量プロセスが必要な場合は、Erlangを使用して、メッセージを介して通信する数千のスレッドを作成します。 Javaでは、ミューテックスやセマフォと共通のメモリを共有する多数のスレッドがあります。これは、さまざまな問題のセット用に設計された、単なる別のプログラミングモデルです。

コメント

  • ですから、明確にするために、これはErlangで役立つアプローチです。そして、Javaの考え方の問題を無視すると、実際に役立つ可能性がありますか?
  • @redjamjar、それはありそうにありません。 Javaで役立つためには、言語自体はそのような使用にはあまり適していません。その主な(そして唯一の)利点である、すぐに使用できるライブラリの膨大な本体は、'適合しませんそのようなエイリアンプログラミングアプローチによく入ります。
  • そのモデルが必要な場合は、Erlangを使用するだけで、1桁簡単になります
  • Java!= JVM、ただ:)
  • @Bane、これらの"利点"は、'比較するものがありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です