Provided by: manpages-ja-dev_0.5.0.0.20210215+dfsg-1_all
名前
sched_setattr, sched_getattr - スケジューリングポリシーと属性の設定と取得を行なう
書式
#include <sched.h> int sched_setattr(pid_t pid, const struct sched_attr *attr, unsigned int flags); int sched_getattr(pid_t pid, const struct sched_attr *attr, unsigned int size, unsigned int flags);
説明
sched_setattr() sched_setattr() システムコールは、 pid で指定された ID を持つスレッドのスケジューリングポ リシーと関連する属性を設定する。 pid が 0 の場合、呼び出したスレッド自身のスケジューリング ポリシーと属性が設定される。 現在のところ、 Linux では、 以下の「通常」の (つまり、リアルタイムではない) スケジューリン グポリシーが、 policy に指定できる値としてサポートされている。 SCHED_OTHER 標準の、ラウンドロビンによる時分割型のスケジューリングポリシー。 SCHED_BATCH 「バッチ」形式でのプロセスの実行用。 SCHED_IDLE 「非常に」低い優先度で動作するバックグラウンドジョブ用。 どの実行可能スレッドを選択するかについて、より正確な制御を必要とする 時間の制約が厳しい特 別なアプリケーション用として、 いろいろな「リアルタイム」ポリシーもサポートされている。 プ ロセスがこれらのポリシーをいつ使用できるかを決めるルールについては、sched(7) を参照。 policy には以下のリアルタイムポリシーを指定できる。 SCHED_FIFO ファーストイン、ファーストアウト型のポリシー。 SCHED_RR ラウンドロビン型のポリシー。 Linux では以下のポリシーも提供されている。 SCHED_DEADLINE デッドライン (応答期限) ベースのスケジューリングポリシー。詳細は sched(7) を 参照。 attr 引き数は、 指定したスレッドの新しいスケジューリングポリシーと属性を定義した構造体への ポインターである。 この構造体は以下の形式である。 struct sched_attr { u32 size; /* この構造体のサイズ */ u32 sched_policy; /* ポリシー (SCHED_*) */ u64 sched_flags; /* フラグ */ s32 sched_nice; /* nice 値 (SCHED_OTHER, SCHED_BATCH) */ u32 sched_priority; /* 静的優先度 (SCHED_FIFO, SCHED_RR) */ /* 残りのフィールドは SCHED_DEADLINE 用である */ u64 sched_runtime; u64 sched_deadline; u64 sched_period; }; この構造体のフィールドは以下の通りである。 size このフィールドには、 構造体のバイト単位のサイズを設定する。 sizeof(struct sched_attr) を指定すればよい。 指定された構造体がカーネル構造体よりも小さい場合、 追加となるフィールドは 0 とみなされる。 指定された構造体がカーネル構造体よりも大き い場合、 カーネルは追加のフィールドが 0 であるかを検査する。 0 でない場合は sched_setattr() はエラー E2BIG で失敗するので、 size をカーネル構造体のサイズに更新 する必要がある。 ユーザー空間の sched_attr 構造体のサイズがカーネル構造体のサイズと一致しなかった場 合の上記の動作は、 このインターフェースを将来拡張できるようにするためである。 サイ ズが大きい構造体を渡す行儀の良くないアプリケーションも、 将来カーネルの sched_attr 構造体のサイズが大きくなったとしてもおかしくならない。 この仕組みにより、 将来的に は、 大きなユーザー空間 sched_attr 構造体があることを知っているアプリケーションで、 大きいサイズの構造体に対応していない古いカーネル上で動作しているかを判定することが できる。 sched_policy このフィールドはスケジューリングポリシーを指定する。 上記のリストにある SCHED_* 値 のいずれかを指定する。 sched_flags このフィールドはスケジューリング動作の制御を行う。 現在のところ、サポートされている フラグは SCHED_FLAG_RESET_ON_FORK の一つだけである。 このフラグが指定されると、 fork(2) で作成された子プロセスは特権が必要なスケジューリングポリシーを継承しない。 詳細は sched(7) を参照。 sched_nice このフィールドは、 sched_policy に SCHED_OTHER か SCHED_BATCH が指定された場合に設 定される nice 値を指定する。 nice 値は -20 (高優先度) から +19 (低優先度) の範囲の 数値である。 setpriority(2) を参照。 sched_priority このフィールドは、 sched_policy に SCHED_FIFO か SCHED_RR が指定された場合に設定さ れる静的優先度を指定する。 これらのポリシーで指定できる優先度の範囲は、 sched_get_priority_min(2) と sched_get_priority_max(2) を使って判定できる。 他のポ リシーでは、 このフィールドには 0 を指定しなければならない。 sched_runtime このフィールドは、 デッドラインスケジューリングの "Runtime" パラメーターを指定す る。 この値はナノ秒単位で表現される。 このフィールドと次の 2 つのフィールドは SCHED_DEADLINE スケジューリングにおいてのみ使用される。 詳細は sched(7) を参照。 sched_deadline このフィールドは、 デッドラインスケジューリングの "Deadline" パラメーターを指定す る。 この値はナノ秒単位で表現される。 sched_period このフィールドは、 デッドラインスケジューリングの "Period" パラメーターを指定する。 この値はナノ秒単位で表現される。 flags 引き数は、このインターフェースの将来の拡張のために用意されている。 現在の実装では 0 を指定しなければならない。 sched_getattr() sched_getattr() システムコールは、 pid で指定された ID を持つスレッドのスケジューリングポ リシーと関連する属性を取得する。 pid が 0 の場合、呼び出したスレッド自身のスケジューリング ポリシーと関連する属性を取得する。 size 引き数には、 ユーザー空間での sched_attr 構造体の大きさを設定する。 この値は、 少なく とも初期バージョンの sched_attr 構造体のサイズでなければならない。 そうでなかった場合、 エ ラー EINVAL で呼び出しが失敗する。 取得したスケジューリング属性は、 attr が指す sched_attr 構造体の各フィールドに格納される。 カーネルは attr.size に sched_attr 構造体のサイズを設定する。 呼び出し側が提供した attr バッファーがカーネルの sched_attr 構造体よりも大きい場合、 ユー ザー空間構造体の残りのバイトは変更されない。 呼び出し側が提供した構造体がカーネルの sched_attr 構造体よりも小さく、 カーネルが値を返すのにもっと大きな空間が必要な場合、 sched_getattr() はエラー E2BIG で失敗する。 sched_setattr() と同様、 この動作はこのイン ターフェースの将来の拡張性を考慮してのものである。 flags 引き数は、このインターフェースの将来の拡張のために用意されている。 現在の実装では 0 を指定しなければならない。
返り値
成功した場合は sched_setattr() と sched_getattr() は 0 を返す。 エラーの場合は -1 が返さ れ、 エラーの原因を示す値が errno に設定される。
エラー
sched_getattr() と sched_setattr() の両方が以下の理由で失敗する。 EINVAL attr が NULL である。 pid が負である。 flags が 0 以外である。 ESRCH ID が pid のスレッドが見つからなかった。 さらに、 sched_getattr() は以下の理由でも失敗する。 E2BIG size と attr で指定されたバッファーが小さすぎる。 EINVAL size が無効である。つまり、 最初のバージョンの sched_attr 構造体 (48 バイト) よりも 小さいか、 システムのページサイズよりも大きい。 さらに、 sched_setattr() は以下の理由でも失敗する。 E2BIG size と attr で指定されたバッファーがカーネル構造体よりも大きく、 一つ以上の超過バ イトが 0 でなかった。 EBUSY SCHED_DEADLINE の流入制御の失敗については sched(7) を参照。 EINVAL attr.sched_policy が認識できるポリシーではない。 attr.sched_flags に SCHED_FLAG_RESET_ON_FORK 以外のフラグが含まれている。 attr.sched_priority が無効で ある。 attr.sched_policy が SCHED_DEADLINE で、 attr に指定されたデッドラインスケ ジューリングパラメーターが無効である。 EPERM 呼び出した元が適切な特権を持っていない。 EPERM 呼び出し元の CPU affinity マスクにシステムの全ての CPU のうち含まれていないものがあ る (sched_setaffinity(2) を参照)。
バージョン
これらのシステムコールは Linux 3.14 で初めて登場した。
準拠
これらのシステムコールは非標準の Linux による拡張である。
注意
sched_setattr() は、sched_setscheduler(2), sched_setparam(2), nice(2) の機能および setpriority の一部機能を持つ (ただし、setpriority(2) の、指定されたユーザーに所属するすべ てのプロセスまたは指定されたグループのすべてのプロセスの優先度を設定する機能は除く)。 同様 に、 sched_getattr() は sched_getscheduler(2), sched_getparam(2) の機能および getpriority(2) の一部機能を持つ。
バグ
バージョン 3.15 までの Linux では、 sched_settattr() は、 エラーの節に書かれている E2BIG の場合にエラーEFAULT で失敗していた。
関連項目
chrt(1), nice(2), sched_get_priority_max(2), sched_get_priority_min(2), sched_getaffinity(2), sched_getscheduler(2), sched_getparam(2), sched_rr_get_interval(2), sched_setaffinity(2), sched_setscheduler(2), sched_setparam(2), sched_yield(2), setpriority(2), pthread_getschedparam(3), pthread_setschedparam(3), pthread_setschedprio(3), capabilities(7), cpuset(7), sched(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。