マルチスレッドのプログラミング

軽量プロセス (LPW)

図 9-1 に LWP、ユーザレベル、およびカーネルレベルの関係を示します。

図 9-1 マルチスレッドのレベルと関係

Graphic

ユーザレベルのスレッドライブラリは、適切なプログラミングが行われていて、オペレーティング環境が正常に動作している限り、現在実行可能なユーザレベルのスレッド数に対して適切な数の利用可能な LWP が存在することを保証しています。しかし、ユーザレベルのスレッドと LWP の間には一対一の関係は存在しないので、ユーザレベルのスレッドはある LWP から別の LWP へと自由に移動できます。

Solaris スレッドでは、プログラマは同時にいくつのスレッドを実行させるかをスレッドライブラリに指定できます。

たとえば、最大 3 個のスレッドを同時に実行させるように指定すると、少なくとも 3 個の LWP が必要になります。3 個のプロセッサが利用可能なら、それらのスレッドは並列に実行されます。しかし、プロセッサが 1 つしか存在しないときは、オペレーティング環境が単一のプロセッサ上で 3 つの LWP を並行化します。すべての LWP がブロックされた場合は、もう 1 つ別の LWP がスレッドライブラリによって実行リソースに追加されます。

同期をとるためにユーザスレッドがブロックすると、そのスレッドが接続している LWP は、実行可能な別のスレッドと接続します。この移行にはコルーチンリンケージが使われ、システムコールは使われません。

オペレーティング環境は、どの LWP をどのプロセッサでいつ実行させるかを決定します。各プロセスにあるユーザスレッドや、ユーザスレッドがいくつ実行可能になっているかなどをオペレーティング環境は認識していません。

カーネルは、LWP のスケジューリングクラスと優先順位に従って、LWP を CPU リソースに割り当てます。同様に、スレッドライブラリはスレッドを LWP に割り当てます。

各 LWP はカーネルによって独立に振り分けられ、独立したシステムコールを実行し、独立したページフォルトを引き起こし、マルチプロセッサのシステム上では並列に動作します。

LWP の機能の中には、特別なスケジューリングクラスなどのように、スレッドからは直接には参照できないものがあります。