SCHED_SETSCHEDULER

Section: Linux Programmer's Manual (2)
Updated: 2017-09-15
Index JM Home Page
 

名前

sched_setscheduler, sched_getscheduler - スケジューリングポリシーとパラメーターを設定/取得する  

書式

#include <sched.h>

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

int sched_getscheduler(pid_t pid);
 

説明

sched_setscheduler() システムコールは、 pid で指定された ID を持つスレッドのスケジューリングポリシーとスケジューリングパラメーターの両方を設定する。 pid が 0 の場合、呼び出したスレッド自身のスケジューリングポリシーとスケジューリングパラメーターが設定される。

スケジューリングパラメーターは param 引数で、以下の形式の構造体へのポインターを指定する。

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

現在の実装では、この構造体のフィールドは sched_priority だけである。 param がどのように解釈されるかは選択されたポリシーによって変わる。

現在のところ、 Linux では、 以下の「通常」の (つまり、リアルタイムではない) スケジューリングポリシーが、 policy に指定できる値としてサポートされている。

SCHED_OTHER
標準の、ラウンドロビンによる時分割型のスケジューリングポリシー。
SCHED_BATCH
「バッチ」形式でのプロセスの実行用。
SCHED_IDLE
「非常に」低い優先度で動作するバックグラウンドジョブ用。

上記のどのポリシーの場合でも、 param->sched_priority は 0 でなければならない。

どの実行可能スレッドを選択するかについて、より正確な制御を必要とする 時間の制約が厳しい特別なアプリケーション用として、 いろいろな「リアルタイム」ポリシーもサポートされている。 プロセスがこれらのポリシーをいつ使用できるかを決めるルールについては、sched(7) を参照。 policy には以下のリアルタイムポリシーを指定できる。

SCHED_FIFO
ファーストイン、ファーストアウト型のポリシー。
SCHED_RR
ラウンドロビン型のポリシー。

上記のどのポリシーの場合でも、 param->sched_priority はそのスレッドのスケジューリングポリシーを指定する。 指定された policy で sched_get_priority_min(2) と sched_get_priority_max(2) を呼び出した返り値の範囲の数字を指定する。 Linux では、これらのシステムコールはそれぞれ 1 と 99 を返す。

Linux 2.6.32 以降では、 sched_setscheduler() を呼び出す際に policy に SCHED_RESET_ON_FORK フラグを OR で指定できる。このフラグが指定されると、 fork(2) で作成された子プロセスは特権が必要なスケジューリングポリシーを継承しない。 詳細は sched(7) を参照。

sched_getscheduler() は pid で識別されるスレッドの現在のスケジューリングポリシーを返す。pid が 0 ならば、呼び出した スレッド自身のスケジューリングポリシーが返される。  

返り値

成功した場合、 sched_setscheduler() は 0 を返す。 成功した場合、 sched_getscheduler() は現在のそのスレッドのポリシー (非負の整数) を返す。 エラーの場合、 どちらのコールも -1 を返し、 errno が適切に設定される。  

エラー

EINVAL
無効な引数: pid が負である、または param が NULL である。
EINVAL
(sched_setscheduler()) policy が認識できるポリシーではない。
EINVAL
(sched_setscheduler()) 引数 param が指定された policy では意味を持たない。
EPERM
呼び出したスレッドが適切な特権を持っていない。
ESRCH
ID が pid のスレッドが見つからなかった。
 

準拠

POSIX.1-2001, POSIX.1-2008 (但し、下記のバグの節も参照)。 SCHED_BATCH と SCHED_IDLE ポリシーは Linux 固有である。  

注意

Further details of the semantics of all of the above "normal" and "real-time" scheduling policies can be found in the sched(7) manual page. That page also describes an additional policy, SCHED_DEADLINE, which is settable only via sched_setattr(2).

POSIX システムでは <unistd.h> に _POSIX_PRIORITY_SCHEDULING が定義されている場合にのみ sched_setscheduler() と sched_getscheduler() が使用できる。

POSIX.1 は、非特権スレッドが sched_setscheduler() を呼び出すために必要な権限の詳細を規定しておらず、 詳細はシステムにより異なる。 例えば、Solaris 7 のマニュアルページでは、 呼び出し元の実ユーザー ID または実効ユーザー ID が 設定対象の実ユーザー ID か保存 (save) set-user-ID と 一致していなければならない、となっている。

Linux では、 スケジューリングポリシーとスケジューリングパラメーターは、 実際にはスレッド単位の属性である。 gettid(2) の呼び出しの返り値をこのシステムコールの pid 引数として渡すことができる。 pid に 0 を指定すると、 呼び出し元のスレッドの属性が設定される。 getpid(2) コールからの返り値を pid に指定すると、 スレッドグループのメインスレッドの属性が設定される (POSIX スレッド API を使用している場合は、 sched_*(2) システムコールの代わりに pthread_setschedparam(3), pthread_getschedparam(3), and pthread_setschedprio(3) を使用すること)。  

バグ

POSIX.1 では、成功時に sched_setscheduler() は直前のスケジューリングポリシーを返すべきとされている。 Linux の sched_setscheduler() はこの要求仕様に準拠しておらず、 成功時には常に 0 を返す。  

関連項目

chrt(1), nice(2), sched_get_priority_max(2), sched_get_priority_min(2), sched_getaffinity(2), sched_getattr(2), sched_getparam(2), sched_rr_get_interval(2), sched_setaffinity(2), sched_setattr(2), sched_setparam(2), sched_yield(2), setpriority(2), capabilities(7), cpuset(7), sched(7)  

この文書について

この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。

関連キーワード

ポリシー   スケジューリング   スレッド   setscheduler   sched   priority   getscheduler   パラメーター   成功   リアルタイム   返り値   特権   詳細   属性   struct   param   自身   構造体   選択   サポート   ラウンド   ロビン   上記   フラグ   バグ

Linux マニュアル 一覧

関連するコマンド・関数

sched_getscheduler.2   sched_getattr.2   sched_setattr.2   pthread_getschedparam.3   pthread_attr_getschedparam.3   pthread_attr_setschedparam.3
 

Index

名前
書式
説明
返り値
エラー
準拠
注意
バグ
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 04:38:59 GMT, October 11, 2026