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

スレッドの生成と使用

スレッドパッケージは、スレッドのデータ構造およびスタックをキャッシュするので、スレッドを繰り返し生成してもシステムに対する負荷は大きくなりません。

ただし、必要に応じてスレッドを生成したり削除したりする方が、専用の処理要求を待つスレッドを維持管理するより付加が大きくなります。

たとえば、RPC サーバがよい例です。RPC サーバは要求が送られてきたらスレッドを生成し、応答を返したらスレッドを削除します。

スレッドの生成のオーバーヘッドがプロセス生成のオーバーヘッドと比べて小さいといっても、数個の命令を実行するのにかかる負荷に比べると効率的ではありません。少なくとも数千の機械語命令が続くような処理を対象にして、スレッドを生成してください。

軽量プロセス (LWP)

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

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

軽量プロセス (LWP) 、ユーザーレベル、およびカーネルレベルの関係を示しています。

ユーザーレベルのスレッドライブラリで利用できる LWP の数は、現在アクティブなユーザーレベルのスレッドに応じて決定されます。オペレーティング環境は、どの LWP をどのプロセッサでいつ実行させるかを決定します。このとき、ユーザースレッドは考慮されません。カーネルは、LWP のスケジューリングクラスと優先順位に従って、LWP を CPU リソースに割り当てます。

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

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

Solaris 9 で導入された新しいスレッドライブラリでは、スレッドごとに 1 つの LWP が割り当てられます。このスレッドライブラリは、Solaris 8 の代替 libthread と同じ機能を持ちます。

この新しい実装によって、従来のスレッドライブラリ設計で発生していた問題 (主に、シグナル処理と多重度) の多くが解決されます。新しいスレッドライブラリには、 thr_setconcurrency(3THR) を使用して目標多重度を設定する必要はありません。すべてのスレッドが LWP 上で実行されるためです。

今後の Solaris リリースのスレッドライブラリでは、複数の LWP 上で非結合スレッドが多重化されるようになる可能性があります。ただし、次にあげる、Solaris 9 で現在有効な制約は保持されます。

非結合スレッド

スレッドライブラリは、必要に応じて LWP を生成し、実行可能なスレッドを LWP に割り当てます。スレッドが割り当てられた LWP はスレッドの状態を引き継ぎ、スレッドの一連の命令を実行します。非結合スレッドが同期機構に基づいてブロックされると、スレッドライブラリはそのスレッドの状態をプロセスメモリに保存し、ほかのスレッドを LWP に割り当てて実行します。

結合スレッド

結合スレッドは、スレッドの生成から終了まで、同一 LWP 上で実行されます。

スレッドの生成に関する指針

次に、スレッドを使用するときの簡単な指針を示します。