CodeZine(コードジン)

特集ページ一覧

pthreadについて(スケジューリング)

スケジューリングの設定とプライオリティ逆転の回避法

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/01/30 14:00
目次

9. スケジューリング(プライオリティ、ポリシー、継承)

9.2 プライオリティ

 プライオリティは優先度という意味で、数字で表現され、最高値と最低値の間で値が決定され、より最高値に近い値もしくは最高値を持つスレッドが優先的に動作します。デフォルトでは0が設定されます。

 下記関数によって設定/参照が行えます。

verify_priority.c
/* 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, &param );
    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_rr_get_interval(pid_t pid, struct timespec *tp)によって間隔を取得できます。
    interval_sched.c
    /* 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;
    }
    
  • SCHED_OTHER
  • いわゆるデフォルトの値で、特権を持たないスレッドはすべてこのポリシーになります。このポリシーの場合、どのように動くべきかは仕様上決められていません。OS依存です。
    後で実験しますが、それなりの動きにはなっているみたいです。

9.4 継承

 上記ポリシーはプロセスにも割り当てられていて、また同様にプロセスにも割り当てる事ができます。

 pthreadにはプロセスに割り当てられたポリシーをスレッドに継承させるか、もしくはプロセスと異なるポリシーをスレッドに割り当てるかの機能が提供されています。

  • PTHREAD_INHERIT_SCHED:スレッドを生成した側のポリシーを継承
  • PTHREAD_EXPLICIT_SCHED:pthread_attr_setschedpolicy等で設定したポリシーを使用

 初期値が上記どちらかの値でなくてはいけないか、明確な規定が無かったように思いますので、基本的にはPTHREAD_EXPLICIT_SCHEDを使用し、使用したいポリシーを明確に設定する方が間違いが少なくてよいかと思います。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:pthreadについて

もっと読む

著者プロフィール

  • 赤松 エイト(エイト)

    (株)DTSに勤てます。 WebアプリやJavaやLL等の上位アプリ環境を密かに憧れつつも、ず~っとLinuxとかHP-UXばかり、ここ数年はカーネル以上アプリ未満のあたりを行ったり来たりしています。 mixiもやってまして、こちらは子育てとか日々の日記メインです。

あなたにオススメ

All contents copyright © 2005-2022 Shoeisha Co., Ltd. All rights reserved. ver.1.5