SETSCHEDULER(2)

名前
sched_setscheduler, sched_getscheduler - スケジューリング・アルゴリズムとパラメーターを設定/取得する

書式
#include <sched.h>

int sched_setscheduler(pid_t pid, int policy, const struct sched_param *p);

int sched_getscheduler(pid_t pid);

struct sched_param {
	...
	int sched_priority;
	...
};

説明
sched_setscheduler は pid によって識別されるプロセスのスケジューリング方針や それにに関連するパラメーターを設定する。pid がゼロの場合は 呼び出したプロセスのスケジューリングが設定される。 パラメーター p の解釈は選択された方針による。現在、Linux では 以下の三つスケジューリング方針がサポートされている: SCHED_FIFO, SCHED_RR, SCHED_OTHER; それぞれの方式については以下で述べる。 sched_getscheduler は pid で識別されるプロセスに現在適用されている スケジューリング方針を尋ねる。pid がゼロならば、呼び出した プロセス自身のスケジューリング方針が返される。

  スケジューリング方針(scheduling policy)
スケジューラー(scheduler)とはカーネルの一部で、次に CPU で実行される 実行可能なプロセスを決定する。Linux のスケジューラーは三つの異った スケジュール方針を提供しており、一つは通常のプロセスのために 二つはリアルタイム(real-time)・アプリケーションのために使われる。 静的優先度(static priority) sched_priority は 全てのプロセスに指定され、この値はシステム・コールを通してのみ変更できる。 sched_priority は 0 から 99 の範囲の値を取ることができ、 スケジューラーはその sched_priority の値それぞれに対して 実行可能なプロセスのリストを管理している。次に実行するプロセスを 決定するために、Linux のスケジューラーは静的優先度の最も高い 空でないリストを探して、そのリストの先頭のプロセスを取り出す。 スケジューリング方針はそれぞれのプロセスが同じ静的優先度を持つ プロセスのリストの中のどこに挿入され、このリストの中をどのように 移動するかを決定する。 SCHED_OTHER はデフォルトの一般的な時分割型スケジューリング方針で、 多くのプロセスによって使用される。SCHED_FIFO とSCHED_RR はどの実行可能プロセスを選択するかについて、より正確な制御を必要とする 時間の制約が厳しい特殊なアプリケーションのためのものである。 SCHED_OTHER でスケジューリングされているプロセスは静的優先度 として 0 が指定されなければならず、SCHED_FIFO や SCHED_RR でスケジューリングされているプロセスは 1 から 99 の範囲の 静的優先度を取ることができる。 スーパー・ユーザー特権を持つプロセスのみが 0 より大きい静的優先度を 取ることができ、SCHED_FIFO や SCHED_RR でスケジューリング できる。sched_get_priority_min と sched_get_priority_max システム・コールを使用することで全ての POSIX.1b 互換システムに 移植可能な方法で有効な優先度の範囲を取得することができる。 全てのスケジューリングはプリエンプティブ(preemptive)である: より高い優先度のプロセスの実行の準備ができると、現在のプロセスは 優先的なものに置きかえられ、待ちリストへ戻される。スケジューリング方針は 同じ静的優先度を持つ実行可能なプロセスのリストの中で順番のみを 決定する。

  SCHED_FIFO: ファーストイン・ファーストアウト・スケジューリング
SCHED_FIFO は 0 より大きな静的優先度でのみ使用でき、 SCHED_FIFO プロセスが実行可能になった場合、すぐに、 現在実行している普通の SCHED_OTHER プロセスと置きかえられる SCHED_FIFO は時分割のない単純なスケジューリング・アルゴリズムである。 SCHED_FIFO 方針でスケジューリングされているプロセスには以下の 規則が適用される: より高い優先度の他のプロセスによって置きかえられた SCHED_FIFO プロセスはその優先度のリストの先頭に留まり続け、 より高い優先度のプロセス全てが停止(block)した場合には再び実行を続ける。 SCHED_FIFO プロセスが実行可能になった時、その優先度のリストの最後 に挿入される。sched_setscheduler や sched_setparam は pid で指定された SCHED_FIFO プロセスが実行可能な場合、 リストの最後に置く。sched_yield を呼び出したプロセスはリストの 最後に置かれる。その他のイベントによって SCHED_FIFO 方針で スケジューリングされるプロセスが同じ優先度の実行可能なプロセスの 待ちリストの中を移動することはない。SCHED_FIFO プロセスは I/O 要求によって停止するか、より高い優先度のプロセスによって置き かえられるか、sched_yield を呼び出すまで実行を続ける。

  SCHED_RR: ラウンド・ロビン(round robin)・スケジューリング
SCHED_RR は SCHED_FIFO の単純な拡張である。 上述された SCHED_FIFO に関する記述は全て SCHED_RR に 適用できる。例外はそれぞれのプロセスは最大時間単位までしか実行できない ということである。SCHED_RR プロセスが時間単位と同じかそれより 長い時間実行されると、その優先度のリストの最後に置かれる。 より高い優先度のプロセスによって置きかえられ、その後実行を再開した
 SCHED_RR プロセスはそのラウンド・ロビン時間単位を完全に使い切る まで実行される。その時間単位の長さは sched_rr_get_interval に よって取得できる。

  SCHED_OTHER: Linux のデフォルトの時分割スケジューリング
SCHED_OTHER は静的優先度 0 でのみ使用できる。 SCHED_OTHER は Linux 標準の時分割スケジューラーで、 特殊な静的優先度を持たず、リアル・タイム機構を必要としていない全ての プロセスで使用される。実行するプロセスは静的優先度 0 のリストの 中のみから、動的優先度(dynamic priority)に基いて決定される。 動的優先度は(nice や setpriority システム・コールに よって設定される) nice レベルに基づいている。この値はプロセスの 実行準備ができており、スケジューラーによって実行が拒否されている間、 時間単位ごとにインクリメントされる。これは全ての SCHED_OTHER プロセスに公平であることを保証する。

  応答時間(response time)
I/O 待ちで停止したより高い優先度のプロセスは再びスケジューリングされる 前にいくらかの応答時間がかかる。デバイス・ドライバーを書く場合には request_irq(9) に記述されている "slow interrupt" 割り込みハンドラーを使用することで この応答時間を劇的に減少させることができる。

  その他
子プロセスは fork の際に親プロセスのスケジューリング・アルゴリズムを継承する。 リアル・タイム・プロセスは大抵、ページングの待ち時間を避けるために mlock や mlockall を使ってメモリ・ロックをしなければならない。 SCHED_FIFO や SCHED_RR でスケジューリングされる プロセスが停止しせず無限ループを行ない、他の全てのより低い優先度のプロセスを 永久に停止(block)させる場合は、ソフトウェア開発者はコンソールのシェルの 静的優先度をテストするアプリケーションよりも常に高く保つべきである。 これによって期待通りに停止したり終了したりしないリアル・タイム・ アプリケーションを緊急終了させることが可能になる。 SCHED_FIFO と SCHED_RR プロセスは、永久に他のプロセスに 優先することができる、それで Linux ではこれらの方針はルートのプロセス のみに与えることができる。 POSIX システムでは <unistd.h> に _POSIX_PRIORITY_SCHEDULING が定義されている場合にのみ sched_setscheduler と sched_getscheduler が使用できる。

返り値
成功した場合、 sched_setscheduler はゼロを返す。 成功した場合、 sched_getscheduler は現在のそのプロセスの方針(非負の整数)を返す。 エラーの場合、-1 が返され、 errno が適切に設定される。

エラー

ESRCH
    IDが pid のプロセスが見つからない。

EPERM
    呼び出したプロセスが適切な特権を持っていない。ルートのプロセスのみが SCHED_FIFO や SCHED_RR 方針を与えることができる。 sched_setscheduler を呼び出すプロセスは実効ユーザーID が pid で指定したプロセスの実効ユーザーIDかユーザーIDと等しいか、 スーパー・ユーザーのプロセスでなければならない。

EINVAL
    スケジューリング方針 policy が間違っているか、 パラメーター p がその方針で意味をなさない。

準拠
POSIX.1b (以前の POSIX.4)

バグ
linux-1.3.81 において、SCHED_RR はそれほど丁寧にはテストされて いないため、 正確には POSIX.1b に記述され要求されるような動作をしてい ないかもしれない。

関連項目
sched_setparam(2), sched_getparam(2), sched_yield(2), sched_get_priority_max(2), sched_get_priority_min(2), nice(2), setpriority(2), getpriority(2), mlockall(2), munlockall(2), mlock(2), munlock(2).

Programming for the real world - POSIX.4 by Bill O. Gallmeister, O'Reilly & Associates, Inc., ISBN 1-56592-074-0
IEEE Std 1003.1b-1993 (POSIX.1b 規格)
ISO/IEC 9945-1:1996 - これは新しい POSIX.1 の1996年改訂版であり、 POSIX.1(1990), POSIX.1b(1993), POSIX.1c(1995), POSIX.1i(1995) の全ての規格を含んでいる。