返回值

成功时,sched_setattr()和sched_getattr()返回0。错误时,返回-1,并且设置errno以指示错误原因。

BUGS

在3.15以下的Linux版本中,对于ERRORS中所述的情况,sched_setattr()失败,并显示错误EFAULT而不是E2BIG。

错误说明

sched_getattr()和sched_setattr()都可能由于以下原因而失败:

EINVAL
attr为NULL;或pid为负;或标志不为零。
ESRCH
找不到ID为pid的线程。

另外,sched_getattr()可能由于以下原因而失败:

E2BIG
由size和attr指定的缓冲区太小。
EINVAL
大小无效;也就是说,它小于sched_attr结构的初始版本(48字节)或大于系统页面大小。

另外,sched_setattr()可能由于以下原因而失败:

E2BIG
由size和attr指定的缓冲区大于内核结构,并且多余字节中的一个或多个为非零。
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亲和力掩码不包括系统中的所有CPU(请参阅sched_setaffinity(2))。

语法

#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);

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

SCHED_SETATTR - Linux手册页

Linux程序员手册 第2部分
更新日期: 2019-03-06

说明

sched_setattr()

sched_setattr()系统调用为ID在pid中指定的线程设置调度策略和相关属性。如果pid等于零,则将设置调度策略和调用线程的属性。

当前,Linux支持以下"常规"(即非实时)调度策略,作为可以在策略中指定的值:

SCHED_OTHER
标准的循环分时政策;
SCHED_BATCH
用于"批处理"样式的流程执行;和
SCHED_IDLE
用于运行优先级较低的后台作业。

还支持各种"实时"策略,用于对时间要求严格的特殊应用程序,这些应用程序需要对选择可运行线程执行的方式进行精确控制。有关控制进程何时可以使用这些策略的规则,请参见sched(7)。策略中可以指定的实时策略为:

SCHED_FIFO
先进先出的政策;和
SCHED_RR
轮循政策。

Linux还提供以下策略:

SCHED_DEADLINE
期限安排政策;有关详细信息,请参见sched(7)。

attr参数是指向结构的指针,该结构定义了指定线程的新调度策略和属性。该结构具有以下形式:

struct sched_attr {
    u32 size;              /* Size of this structure */
    u32 sched_policy;      /* Policy (SCHED_*) */
    u64 sched_flags;       /* Flags */
    s32 sched_nice;        /* Nice value (SCHED_OTHER,
                              SCHED_BATCH) */
    u32 sched_priority;    /* Static priority (SCHED_FIFO,
                              SCHED_RR) */
    /* Remaining fields are for SCHED_DEADLINE */
    u64 sched_runtime;
    u64 sched_deadline;
    u64 sched_period;
};

sched_attr结构的字段如下:

size
该字段应设置为以字节为单位的结构大小,如sizeof(struct sched_attr)。如果提供的结构小于内核结构,则假定任何其他字段为" 0"。如果提供的结构大于内核结构,则内核将验证所有其他字段均为0;否则,内核将验证所有其他字段为0。如果不是,则sched_setattr()失败,并显示错误E2BIG,并更新大小以包含内核结构的大小。
当用户空间的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
fork(2)创建的子代不会继承特权调度策略。有关详细信息,请参见sched(7)。
SCHED_FLAG_RECLAIM(since Linux 4.13)
该标志允许SCHED_DEADLINE线程回收其他实时线程未使用的带宽。
SCHED_FLAG_DL_OVERRUN(since Linux 4.16)
该标志允许应用程序了解SCHED_DEADLINE线程中的运行时超限。此类超限可能是由于(例如)执行时间过长或参数分配不正确引起的。通知采用SIGXCPU信号的形式,该信号在每次超限时生成。
此SIGXCPU信号是过程控制的(请参见signal(7)),而不是线程控制的。这可能是一个错误。一方面,sched_setattr()用于设置每个线程的属性。另一方面,如果将进程控制信号传递到进程内部的一个线程,而不是运行时溢出的线程,则应用程序将无法知道哪个线程溢出了。
sched_nice
当将sched_policy指定为SCHED_OTHER或SCHED_BATCH时,此字段指定要设置的精确值。 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
该字段指定用于截止日期调度的"运行时"参数。该值以纳秒表示。该字段以及接下来的两个字段仅用于SCHED_DEADLINE调度;有关更多详细信息,请参见sched(7)。
sched_deadline
该字段指定用于期限安排的"期限"参数。该值以纳秒表示。
sched_period
此字段指定用于期限调度的"期间"参数。该值以纳秒表示。

提供flags参数以允许将来扩展接口。在当前实现中,必须将其指定为0。

sched_getattr()

sched_getattr()系统调用获取其ID在pid中指定的线程的调度策略和相关属性。如果pid等于零,则将检索调用线程的调度策略和属性。

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。

版本

这些系统调用首次出现在Linux 3.14中。

遵循规范

这些系统调用是非标准的Linux扩展。

名称

sched_setattr,sched_getattr-设置和获取调度策略和属性

备注

sched_setattr()提供sched_setscheduler(2),sched_setparam(2),nice(2)和(除了设置属于指定用户的所有进程或指定组中所有进程的优先级的功能之外)的超集。 )setpriority(2)。类似地,sched_getattr()提供了sched_getscheduler(2),sched_getparam(2)和(部分)getpriority(2)功能的超集。

日期:2019-08-20 17:59:18 来源:oir作者:oir