グリーンスレッド

グリーンスレッド（英: green threads）とは、コンピュータプログラミングにおいて、オペレーティングシステム (OS) ではなく、ランタイムライブラリや仮想マシン (VM) によってスケジュールされるスレッドである。グリーンスレッドはネイティブのOSの機能に依存せずに並行性を実現するほか、カーネル空間ではなくユーザー空間で管理されるためネイティブスレッドがサポートされていない環境でも動作しうる。

グリーンスレッドの性能
マルチコアプロセッサのシステムでは、ネイティブスレッドの実装は処理を複数のプロセッサに割り当てることができる。これはグリーンスレッドの実装では不可能である。このような環境ではネイティブスレッドに明らかな利点がある。しかし、ユニプロセッサのシステムでは、最も効率のよいモデルが何なのか、いまだ明確な答えはないComparative performance evaluation of Java threads for embedded applications: Linux Thread vs. Green Thread 。

また、ネイティブスレッド（あるいはマルチプロセス処理）とグリーンスレッドを併用することも行なわれる。

では下記の点が明らかになった。

 スレッドの起動と同期については、グリーンスレッドが、Linuxのネイティブスレッドの性能を遥かに上回る。
 I/Oやコンテキストスイッチについては、Linuxのネイティブスレッドが、わずかに良い性能を示す。

また、グリーンスレッドにおいてブロックするI/O処理を実行すると、他のすべてのグリーンスレッドをブロックする可能性がある。この問題を避けるため、グリーンスレッドを使うプログラムでは非同期I/O処理を行わなければならない。

Java 仮想マシンにおけるグリーンスレッド

Java 1.1では、グリーンスレッドが JVM の使用可能な唯一のスレッドモデルであった。グリーンスレッドはネイティブスレッドに対していくつか制限があるため、以降のJavaのバージョンではネイティブスレッドを優先しグリーンスレッドをサポートしなくなった。

例外として低消費電力デバイス向けのオペレーティングシステムとJava仮想マシンの中間と考えられるSquawk virtual machineがある。Squawk VMはネイティブコードを最小限の部分のみに用い、これらの最小部分を移行するためにグリーンスレッドを用いている。

その他の仮想マシンにおけるグリーンスレッド

仮想マシンを用いる言語処理系で、ネイティブスレッドではないグリーンスレッドと等価なスレッドを実装したものが存在する。
例えば：
 Ruby (CRuby) 1.8 Ruby 1.8の標準C実装では、スレッドをグリーンスレッドとして実装している。
 Racket
 Haskell
 Smalltalk (大半の Smalltalk の方言: Squeak Smalltalk, VisualWorks, GNU Smalltalk など)
 Stackless Python. 標準の C 実装の Python はシステムスレッドによる並列処理をサポートしているが、スレッド安全性を提供するために、グローバルインタプリタロックを用いている。このためスレッドの並行動作が妨げられる。  Stackless Python はプリエンプティブマルチタスクとマイクロスレッドによる協調マルチタスク(いわゆるtasklets)の両方をサポートしている。 

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

多くのグリーンスレッドの実装では、優先度逆転を防ぐ仕組みを持っていない。

脚注

関連項目
 Light-weight process
 スレッド
 Java仮想マシン
 グローバルインタプリタロック
 ファイバー (コンピュータ)

外部リンク
 JavaWorld article about Green threads
 Green threads on Java threads FAQ

Category:スレッド (コンピュータ)
Category:Javaプラットフォーム