9. スケジューリング(プライオリティ、ポリシー、継承)
9.2 プライオリティ
プライオリティは優先度という意味で、数字で表現され、最高値と最低値の間で値が決定され、より最高値に近い値もしくは最高値を持つスレッドが優先的に動作します。デフォルトでは0が設定されます。
下記関数によって設定/参照が行えます。
/* gcc verify_priority.c -o verify_priority -W -Wall -g */ #include <stdio.h> #include <pthread.h> #include <sched.h> int main( ) { struct sched_param param; pthread_attr_t attr; pthread_attr_init( &attr ); pthread_attr_getschedparam( &attr, ¶m ); printf( "now priority:[%d]\n", param.sched_priority ); printf( "sched_get_priority_min( SCHED_FIFO ):[%d]\n", sched_get_priority_min( SCHED_FIFO )); printf( "sched_get_priority_max( SCHED_FIFO ):[%d]\n", sched_get_priority_max( SCHED_FIFO )); printf( "sched_get_priority_min( SCHED_RR ) :[%d]\n", sched_get_priority_min( SCHED_RR )); printf( "sched_get_priority_max( SCHED_RR ) :[%d]\n", sched_get_priority_max( SCHED_RR )); return 0; }
9.3 ポリシー
ポリシーは同じプライオリティを持つスレッドに対してどのように動作させるかを定義したものです。
同値プライオリティを持った複数のスレッドが実行可能状態にいる場合、OSはそのうちのどれかを選択して実行します。その選択方法はOS依存で、アプリケーションに対してインターフェースは公開されていません。ポリシーは、そのような状況時にて、スレッドの大まかな実行期間をOSに対し指示する機能です。
使用できるポリシーは下記の通り3種類あります。
- SCHED_FIFO
- mutexやcondition等でブロックした
- sleep()などの呼びだしでサスペンドした
- sched_yield()を呼びだした
- SCHED_RR
- SCHED_OTHER
sched_rr_get_interval(pid_t pid, struct timespec *tp)によって間隔を取得できます。/* gcc interval_sched.c -o interval_sched -W -Wall -g */ #include <stdio.h> #include <sys/time.h> #include <sched.h> int main( ) { struct timespec tp = { 0,0 }; sched_rr_get_interval( 0, &tp ); printf( "sched_rr_get_interval " "tp.tv_sec:[%ld] tp.tv_nsec:[%ld]\n", tp.tv_sec, tp.tv_nsec ); return 0; }
9.4 継承
上記ポリシーはプロセスにも割り当てられていて、また同様にプロセスにも割り当てる事ができます。
pthreadにはプロセスに割り当てられたポリシーをスレッドに継承させるか、もしくはプロセスと異なるポリシーをスレッドに割り当てるかの機能が提供されています。
- PTHREAD_INHERIT_SCHED:スレッドを生成した側のポリシーを継承
- PTHREAD_EXPLICIT_SCHED:pthread_attr_setschedpolicy等で設定したポリシーを使用
初期値が上記どちらかの値でなくてはいけないか、明確な規定が無かったように思いますので、基本的にはPTHREAD_EXPLICIT_SCHEDを使用し、使用したいポリシーを明確に設定する方が間違いが少なくてよいかと思います。
