グリーンスレッド

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

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

グリーンスレッドの性能[編集]

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

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

  • グリーンスレッドはスレッドの起床と同期化について、Linux のネイティブスレッドの性能を上回る。
  • Linux のネイティブスレッドは I/Oコンテキストスイッチの処理に関して、大きく上回る性能を持つ。

また、グリーンスレッドはブロックする 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日閲覧。 “ラウンドロビンスケジューラが組み込まれている。これはタスクレットを協調的にもプリエンプティブ的にもスケジュールすることができる

関連項目[編集]

外部リンク[編集]