Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       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_policySCHED_OTHERSCHED_BATCH  が指定された場合に設
              定される  nice 値を指定する。 nice 値は -20 (高優先度) から +19 (低優先度) の範囲の
              数値である。 sched(7) を参照。

       sched_priority
              このフィールドは、 sched_policySCHED_FIFOSCHED_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.sizesched_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  sizeattr で指定されたバッファーが小さすぎる。

       EINVAL size が無効である。つまり、 最初のバージョンの sched_attr 構造体 (48 バイト) よりも
              小さいか、 システムのページサイズよりも大きい。

       さらに、 sched_setattr() は以下の理由でも失敗する。

       E2BIG  sizeattr で指定されたバッファーがカーネル構造体よりも大きく、  一つ以上の超過バ
              イトが 0 でなかった。

       EBUSY  SCHED_DEADLINE の流入制御の失敗については sched(7) を参照。

       EINVAL attr.sched_policy      が認識できるポリシーではない。      attr.sched_flagsSCHED_FLAG_RESET_ON_FORK 以外のフラグが含まれている。 attr.sched_priority  が無効で
              ある。  attr.sched_policySCHED_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/ に書かれている。