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

LWP のスケジューリングとスレッドの結合

スレッドライブラリは、非結合スレッドを実行するための、実行リソース内の LWP 数を自動的に調整します。これには次の目的があります。

タイムスライスが適用されるのは LWP であって、スレッドではありません。つまり、LWP が 1 つしか存在しなければ、プロセス内でタイムスライスは行われません。その LWP 上のスレッドは、スレッド間同期機構でブロックされるか、実行リソースを横取りされるか、または終了するまで実行を続けます。

スレッドに対する優先順位は、pthread_setprio(3T) で設定できます。優先順位の低い非結合スレッドは、それよりも優先順位の高い非結合スレッドが実行可能になっていないときだけ LWP に割り当てられます。ただし、結合スレッドは自分専用の LWP をもつので、LWP を争奪することはありません。なお、pthread_setprio() で設定されるスレッド優先順位は、CPU に対してではなく LWP に対するスレッドのアクセスを調整します。

スケジューリングをきめ細かく制御する必要がある場合は、スレッドを LWP に結合します。多数の非結合スレッドが 1 つの LWP を争奪するような状況では、きめ細かい制御を実現できないからです。

特に、優先順位の低い非結合スレッドが優先順位の高い LWP 上にあり CPU 上で実行されていて、優先順位の低い LWP に割り当てられた優先順位の高い非結合スレッドが実行されていないことがあります。このようにスレッドの優先順位は、CPU へのアクセスについての 1 つのヒントにすぎません。

リアルタイムスレッドは、外部からの入力に対して迅速な応答が必要なときに使用します。たとえば、マウスの動きを追跡するスレッドは、マウスボタンのクリックにただちに反応しなければなりません。そのスレッドを LWP に結合すれば、必要なときにいつでも LWP を使用できるようになります。その LWP をリアルタイムスケジューリングクラスに割り当てれば、マウスボタンのクリックに迅速に反応するようにスケジューリングされます。