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

スケジューリング

POSIX はスケジューリングの方針として、先入れ先出し (SCHED_FIFO)、ラウンドロビン (SCHED_RR)、カスタム (SCHED_OTHER) の 3 つを規定しています。SCHED_FIFO は待ち行列ベースのスケジューラで、優先レベルごとに異なる待ち行列をもっています。SCHED_RR は FIFO に似ていますが、各スレッドに実行時間の制限があるという点が異なります。

SCHED_FIFOSCHED_RR は両方とも POSIX のリアルタイム拡張機能です。SCHED_OTHER がデフォルトのスケジューリング方針です。

SCHED_OTHER 方針、および POSIX の SCHED_FIFO 方針と SCHED_RR 方針のプロパティのエミュレートについては、「LWP とスケジューリングクラス」を参照してください。

スケジューリングスコープ (スケジューリングの適応範囲) として、プロセススコープ (非結合スレッド用) とシステムスコープ (結合スレッド用) の 2 つが使用できます。スコープの状態が異なるスレッドが同じシステムに同時に存在でき、さらに同じプロセスにも同時に存在できます。通常、スコープは適応範囲を設定します。その範囲内でスレッドの方針が有効となります。

プロセススコープ (非結合スレッド)

非結合スレッドは PTHREAD_SCOPE_PROCESS として生成されます。このようなスレッドはユーザ空間内でスケジュールされ、LWP プールの中の使用可能な LWP に対して接続されたり切り離されたりします。LWP はこのプロセス内のスレッドにのみ使用可能です。つまり、スレッドはこれらの LWP にスケジュールされるわけです。

通常は PTHREAD_SCOPE_PROCESS スレッドを使用します。そうすれば、LWP の間でスレッドの使い回しができるので、スレッドの効率が良くなります (また、Solaris スレッドを THR_UNBOUND 状態で生成するのと同じことになります)。スレッドライブラリは、他のスレッドを考慮しつつ、どのスレッドがカーネルのサービスを受けるかを決定します。

システムスコープ (結合スレッド)

結合スレッドは PTHREAD_SCOPE_SYSTEM として生成されます。結合スレッドは、LWP に永久に結合されます。

それぞれの結合スレッドは、初めから終わりまで特定の LWP に結び付けられています。これは Solaris スレッドを THR_BOUND 状態で生成するのと同じことです。スレッドを結合することによって、スレッドに代替シグナルスタックを与えたり、リアルタイムスケジューリングで特別なスケジューリング属性を使用したりできます。すべてのスケジューリングは、オペレーティング環境で行われます。


注 -

結合と非結合のいずれのスレッドの場合でも、他のプロセスからスレッドに直接アクセスしたり、他のプロセスに移動したりできません。