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

グリーンスレッドの性能

編集

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

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

Linuxカーネルを動作させたコンピュータのベンチマーク[要出典]では下記の点が明らかになった。

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

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

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

編集

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

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

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

編集

仮想マシンを用いる言語処理系で、ネイティブスレッドではないグリーンスレッドと等価なスレッドを実装したものが存在する。 例えば:

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

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

参考文献

編集
  1. ^ Comparative performance evaluation of Java threads for embedded applications: Linux Thread vs. Green Thread [1]
  2. ^ Ruby 1.8 の標準 C 実装では、スレッドをグリーンスレッドとして実装している。[2]
  3. ^ Concurrency and Python”. Dr. Dobb's Journal (2008年2月3日). 2008年7月12日閲覧。 “GIL は Python のすべてのクリティカルセクションを保護するために用いられているロックである。 そのため、仮に複数の CPU があっても、一度にひとつのスレッドだけしか Python 的な動作を行うことができない。
  4. ^ Stackless.com: About Stackless”. 2008年8月27日閲覧。 “ラウンドロビンスケジューラが組み込まれている。これはタスクレットを協調的にもプリエンプティブ的にもスケジュールすることができる

関連項目

編集

外部リンク

編集