SCHED_SETATTR
Section: Linux Programmer's Manual (2)
Updated: 2020-11-01
Index
JM Home Page
roff page
 
名前
sched_setattr, sched_getattr - スケジューリングポリシーと属性の設定と取得を行なう
 
書式
#include <sched.h>
 int sched_setattr(pid_t pid, struct sched_attr *attr,
                  unsigned int flags);
 int sched_getattr(pid_t pid, 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;
};
構造体 sched_attr のフィールドは以下の通りである。
- size
 - 
このフィールドには、 構造体のバイト単位のサイズを設定する。 sizeof(struct sched_attr) を指定すればよい。
指定された構造体がカーネル構造体よりも小さい場合、 追加となるフィールドは 0 とみなされる。 指定された構造体がカーネル構造体よりも大きい場合、
カーネルは追加のフィールドが 0 であるかを検査する。 0 でない場合は sched_setattr() はエラー E2BIG
で失敗するので、 size をカーネル構造体のサイズに更新する必要がある。
 - 
ユーザー空間の sched_attr 構造体のサイズがカーネル構造体のサイズと一致しなかった場合の上記の動作は、
このインターフェースを将来拡張できるようにするためである。 サイズが大きい構造体を渡す行儀の良くないアプリケーションも、 将来カーネルの
sched_attr 構造体のサイズが大きくなったとしてもおかしくならない。 この仕組みにより、 将来的には、 大きなユーザー空間
sched_attr 構造体があることを知っているアプリケーションで、
大きいサイズの構造体に対応していない古いカーネル上で動作しているかを判定することができる。
 - sched_policy
 - 
このフィールドはスケジューリングポリシーを指定する。 上記のリストにある SCHED_* 値のいずれかを指定する。
 - sched_flags
 - 
This field contains zero or more of the following flags that are ORed
together to control scheduling behavior:
- 
 SCHED_FLAG_RESET_ON_FORK- 
Children created by fork(2)  do not inherit privileged scheduling
policies.  See sched(7)  for details.
 - SCHED_FLAG_RECLAIM (Linux 4.13 以降)
 - 
This flag allows a SCHED_DEADLINE thread to reclaim bandwidth unused by
other real-time threads.
 - SCHED_FLAG_DL_OVERRUN (Linux 4.16 以降)
 - 
This flag allows an application to get informed about run-time overruns in
SCHED_DEADLINE threads.  Such overruns may be caused by (for example)
coarse execution time accounting or incorrect parameter assignment.
Notification takes the form of a SIGXCPU signal which is generated on
each overrun.
 - 
This SIGXCPU signal is process-directed (see signal(7))  rather
than thread-directed.  This is probably a bug.  On the one hand,
sched_setattr()  is being used to set a per-thread attribute.  On the
other hand, if the process-directed signal is delivered to a thread inside
the process other than the one that had a run-time overrun, the application
has no way of knowing which thread overran.
 
 
 - sched_nice
 - 
このフィールドは、 sched_policy に SCHED_OTHER か SCHED_BATCH が指定された場合に設定される
nice 値を指定する。 nice 値は -20 (高優先度) から +19 (低優先度) の範囲の数値である。 sched(7) を参照。
 - 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 構造体のサイズを設定する。
If the caller-provided attr buffer is larger than the kernel's
sched_attr structure, the additional bytes in the user-space structure
are not touched.  If the caller-provided structure is smaller than the
kernel sched_attr structure, the kernel will silently not return any
values which would be stored outside the provided space.  As with
sched_setattr(), these semantics allow for future extensibility of the
interface.
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
 - 
pid で指定されたスレッドの 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_setattr() は、 エラーの節に書かれている E2BIG
の場合にエラーEFAULT で失敗していた。
In Linux versions up to 5.3, sched_getattr()  failed with the error
EFBIG if the in-kernel sched_attr structure was larger than the
size passed by user space.
 
関連項目
 chrt(1), nice(2), sched_get_priority_max(2),
sched_get_priority_min(2), sched_getaffinity(2), sched_getparam(2),
sched_getscheduler(2), sched_rr_get_interval(2),
sched_setaffinity(2), sched_setparam(2), sched_setscheduler(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 プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/ に書かれている。
 Index
- 名前
 - 
 - 書式
 - 
 - 説明
 - 
- sched_setattr()
 - 
 - sched_getattr()
 - 
 
 - 返り値
 - 
 - エラー
 - 
 - バージョン
 - 
 - 準拠
 - 
 - 注意
 - 
 - バグ
 - 
 - 関連項目
 - 
 - この文書について
 - 
 
This document was created by
man2html,
using the manual pages.
Time: 16:46:42 GMT, November 24, 2023