グリーンスレッド (英 : green threads )とは、コンピュータプログラミング において、オペレーティングシステム ではなく、ランタイムライブラリ や仮想マシン (VM) によってスケジュールされるスレッド である。グリーンスレッドはネイティブのOSの機能に依存せずに並行性を実現するほか、カーネル空間 ではなくユーザー空間 で管理されるためネイティブスレッドがサポートされていない環境でも動作しうる。
グリーンスレッドの性能
マルチコア プロセッサのシステムでは、ネイティブスレッドの実装は処理を複数のプロセッサに割り当てることができる。これはグリーンスレッドの実装では不可能である。このような環境ではネイティブスレッドに明らかな利点がある。しかし、ユニプロセッサのシステムでは、最も効率のよいモデルが何なのか、いまだ明確な答えはない[ 1] 。
また、ネイティブスレッド(あるいはマルチプロセス処理)とグリーンスレッドを併用することも行なわれる。
Linuxカーネル を動作させたコンピュータのベンチマーク[要出典 ] では下記の点が明らかになった。
スレッドの起動と同期 については、グリーンスレッドが、Linuxのネイティブスレッドの性能を遥かに上回る。
I/O やコンテキストスイッチ については、Linuxのネイティブスレッドが、わずかに良い性能を示す。
また、グリーンスレッドにおいてブロックするI/O処理を実行すると、他のすべてのグリーンスレッドをブロックする可能性がある。この問題を避けるため、グリーンスレッドを使うプログラムでは非同期I/O 処理を行わなければならない。
Java 仮想マシンにおけるグリーンスレッド
この節は更新が必要とされています。 この節には古い情報が掲載されています。編集の際に新しい情報を記事に
反映 させてください。反映後、このタグは除去してください。
(2021年9月 )
Java 1.1 では、グリーンスレッドが JVM の使用可能な唯一のスレッドモデルであった。グリーンスレッドはネイティブスレッドに対していくつか制限があるため、以降の Java のバージョンではネイティブスレッドを優先しグリーンスレッドをサポートしなくなった。
例外として低消費電力デバイス向けのオペレーティングシステム と Java 仮想マシンの中間と考えられるSquawk virtual machine がある。Squawk VM はネイティブコード を最小限の部分のみに用い、これらの最小部分を移行するためにグリーンスレッドを用いている。
その他の仮想マシンにおけるグリーンスレッド
この節は更新が必要とされています。 この節には古い情報が掲載されています。編集の際に新しい情報を記事に
反映 させてください。反映後、このタグは除去してください。
(2021年9月 )
仮想マシン を用いる言語処理系で、ネイティブスレッドではないグリーンスレッドと等価なスレッドを実装したものが存在する。
例えば:
The Erlang 仮想マシンは 'グリーンプロセス' と呼ばれるような機構を持っている。これはオペレーティングシステムのプロセスのようであるが(スレッドのように状態を共有しない)、Erlang Run Time System (erts) の範囲内で実装されている。(誤って)'グリーンスレッド'として参照されることがある。
GHC Haskell の場合、最初の割り当ての後、(変更可能な)一定の時間が経過するとコンテキストスイッチが発生する。GHC スレッドはひとつあるいは複数の OS のスレッド上で動作して、(GHC スレッドと OS スレッドが多:多の関係)SMP マシンでも利用できる各コアの上でコストのかかる OS スレッドを生成せずに並列処理を可能にしている。
Smalltalk の仮想マシンは評価の段階を考慮していない。しかし、VM は実行中のスレッドに対して
外部のシグナル(タイマーの時間切れ、I/Oが利用可能になった、など)で割り込むことができる。たとえば QKS Smalltalk では、評価の段階を考慮し、グリーンスレッドをサポートし、さらに優先度逆転を防いでいる。大半の Smalltalk 環境では、定期的に起床する高い優先度のプロセスがタイムシェアリングのプリエンプション をうまく実現している。
[
[(Delay forMilliseconds: 50) wait] repeat
] forkAt: Processor highIOPriority
多くのグリーンスレッドの実装では、優先度逆転 を防ぐ仕組みを持っていない。
参考文献
^ Comparative performance evaluation of Java threads for embedded applications: Linux Thread vs. Green Thread [1]
^ Ruby 1.8 の標準 C 実装では、スレッドをグリーンスレッドとして実装している。[2]
^ “Concurrency and Python ”. Dr. Dobb's Journal (2008年2月3日). 2008年7月12日 閲覧。 “GIL は Python のすべてのクリティカルセクションを保護するために用いられているロックである。 そのため、仮に複数の CPU があっても、一度にひとつのスレッドだけしか Python 的な動作を行うことができない。 ”
^ “Stackless.com: About Stackless ”. 2008年8月27日 閲覧。 “ラウンドロビンスケジューラが組み込まれている。これはタスクレットを協調的にもプリエンプティブ的にもスケジュールすることができる ”
関連項目
外部リンク