SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

pthreadについて

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

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


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を使用し、使用したいポリシーを明確に設定する方が間違いが少なくてよいかと思います。

次のページ
9. スケジューリング(サンプル)

この記事は参考になりましたか?

pthreadについて連載記事一覧

もっと読む

この記事の著者

赤松 エイト(エイト)

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1971 2008/08/20 16:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー