これらのタイプのスレッドによって提供される利点を理解したいと思います。
どの環境で、グリーンスレッドは非グリーンスレッドよりも優れていますか?グリーンスレッドはマルチコアプロセッサに適していると言う人もいます。
予想される動作の問題。
ウィキペディアの記事 Green Threads で非常によく説明されています。
緑のスレッドは「ユーザーレベルのスレッド」です。これらは、カーネルではなく、「通常の」ユーザーレベルのプロセスによってスケジュールされます。そのため、その機能を提供しないプラットフォームでマルチスレッドをシミュレートするために使用できます。
Javaのコンテキストでは、特に、グリーンスレッドは過去のものです。記事 JDK 1.1 for Solaris開発者ガイド を参照してください。(Solarisについてですが、緑色のスレッドは使用されなくなり、通常のプラットフォームで有効になります)。
バージョン1.3のリリースの時点で、Sun JVM for Linuxのグリーンスレッドは廃止されました(archive.orgの Java [tm] Technology on the Linux Platform を参照)。それは2000年にさかのぼります。Solarisの場合、ネイティブスレッドはJDK 1.2から利用できました。それは1998年にさかのぼります。Windowsにグリーンスレッドの実装があったとは思いませんが、そのためのリファレンスが見つかりません。
ウィキペディアの記事に記載されているように、いくつかの例外があります。私は主に低電力(組み込み)デバイス用に集まっています。
グリーンスレッドメモリは、OSがスタックを作成するのではなく、ヒープから割り当てられます。これにより、並列スレッドが1桁以上増加する可能性があります。他の人が述べたように、これは自動的に複数のプロセッサを利用しませんが、ユースケースは通常I/Oをブロックするためです-例えば、グリーンスレッドは10kではなく100kの同時接続を処理できるかもしれません。
つまり、IO一定の規模でのバインドされた操作には、緑色のスレッドが適しています。
グリーンスレッドは、OSではなくアプリケーションレベルで実装されるスレッドです。これは通常、OSがスレッドAPIを提供しない場合、または必要な方法で動作しない場合に行われます。
したがって、利点は、スレッドのような機能がまったく得られることです。欠点は、グリーンスレッドが実際に複数のコアを使用できないことです。
グリーンスレッドを使用した初期のJVMがいくつかありました(IIRCがLinuxへのBlackdown JVMポートを使用しました)が、最近ではすべてのメインストリームJVMが実際のスレッドを使用しています。まだグリーンスレッドを使用している組み込みJVMが存在する場合があります。
プロセッサよりもアクティブなスレッドが多い場合、グリーンスレッドはネイティブスレッドよりも大幅に高速です。
Javaは当初、グリーンスレッドをサポートしていましたが、最近のほとんどのグリーンスレッドの実装とは異なり、複数のプロセッサに拡張できないため、Javaは複数のコアを利用できません。
次に、Javaは、ネイティブスレッドのみに依存するために、緑色のスレッドを削除しました。これにより、Javaスレッドは緑のスレッドよりも遅くなりました。
グリーンスレッドのJava実装については特に言及していないことに注意してください。これは、他のグリーンスレッドの意味とは異なり、マルチコアまたはマルチプロセッサシステムでスケーリングできないという欠点があります。
グリーンスレッドは、カーネルレベルのスレッドではなく、ユーザーレベルのスレッドです。それらは、カーネルではなくユーザーライブラリによってスケジュールされます。 OSスケジューラーに依存するのではなく、独自のスケジューリングメカニズムを使用してスレッドをスケジュールできます。
グリーンスレッドは、ネイティブOS機能に依存せずにマルチスレッド環境をエミュレートし、カーネルスペースではなくユーザースペースで管理されるため、ネイティブスレッドをサポートしていない環境で動作できます。
パフォーマンス:
マルチコアプロセッサでは、ネイティブスレッドの実装は自動的に作業を複数のプロセッサに割り当てることができますが、グリーンスレッドの実装は通常はできません。グリーンスレッドは、スレッドのアクティブ化と同期においてLinuxネイティブスレッドよりも大幅に優れています。
緑のスレッドがブロッキングシステムコールを実行すると、そのスレッドがブロックされるだけでなく、プロセス内のすべてのスレッドがブロックされます。
グリーンスレッドは、OSによってスケジュールされていません。
つまり、それらのスケジューリングはユーザー空間で行われ、カーネルによって処理されません。これは、通常、すべてのCPUコアを使用するようにグリーンスレッドを作成できないことを意味します。
Java最近(x86またはx64など)を実行している主流プラットフォームの場合、実際のスレッドを使用します。
Javaマルチスレッドは2つのモデルによって実装されます:
グリーンスレッドモデル: JVMが管理するスレッドで、OSのサポートを基盤としないものはグリーンスレッドと呼ばれます。 Sun Solarisのようなごく少数のOSがグリーンスレッドモデルをサポートしています。非推奨であり、使用を推奨しません。
ネイティブOSモデル:基盤となるOSの助けを借りてJVMによって管理されるスレッドは、ネイティブOSモデルと呼ばれます。すべてのWindows OSは、ネイティブOSモデルのサポートを提供します。