SCHED_SETSCHEDULER - Linux手册页

时间:2019-08-20 17:59:18  来源:igfitidea点击:

Linux程序员手册 第2部分
更新日期: 2017-09-15

名称

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()系统调用为ID在pid中指定的线程设置调度策略和参数。如果pid等于零,则将设置调用线程的调度策略和参数。

调度参数在param参数中指定,param参数是指向以下形式的结构的指针:

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

在当前的实现中,该结构仅包含一个字段sched_priority。对参数的解释取决于所选策略。

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

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

对于上述每个策略,param-> sched_priority必须为0。

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

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

对于以上每个策略,param-> sched_priority指定线程的调度优先级。这是通过使用指定策略调用sched_get_priority_min(2)和sched_get_priority_max(2)返回的范围内的数字。在Linux上,这些系统调用分别返回1和99。

从Linux 2.6.32开始,可以在调用sched_setscheduler()时在策略中对SCHED_RESET_ON_FORK标志进行"或"运算。由于包含此标志,因此fork(2)创建的子代不会继承特权调度策略。有关详细信息,请参见sched(7)。

sched_getscheduler()返回由pid标识的线程的当前调度策略。如果pid等于零,则将检索调用线程的策略。

返回值

成功时,sched_setscheduler()返回零。成功后,sched_getscheduler()返回线程的策略(一个非负整数)。错误时,两个调用均返回-1,并正确设置了errno。

错误说明

EINVAL
无效的参数:pid为负或param为NULL。
EINVAL
(sched_setscheduler())策略不是公认的策略之一。
EINVAL
(sched_setscheduler())参数对于指定的策略没有意义。
EPERM
调用线程没有适当的特权。
ESRCH
找不到ID为pid的线程。

遵循规范

POSIX.1-2001,POSIX.1-2008(但请参见下面的错误)。 SCHED_BATCH和SCHED_IDLE策略是特定于Linux的。

备注

可以在sched(7)手册页中找到所有上述"常规"和"实时"调度策略的语义的更多详细信息。该页面还描述了附加策略SCHED_DEADLINE,该策略只能通过sched_setattr(2)进行设置。

可以使用sched_setscheduler()和sched_getscheduler()的POSIX系统在中定义了_POSIX_PRIORITY_SCHEDULING。

POSIX.1没有详细说明非特权线程调用sched_setscheduler()所需的权限,并且各个系统的详细信息有所不同。例如,Solaris 7手册页指出,调用者的真实或有效用户ID必须与目标的真实用户ID或保存集用户ID匹配。

调度策略和参数实际上是Linux上的每个线程属性。调用gettid(2)返回的值可以在参数pid中传递。将pid指定为0将对调用线程的属性进行操作,并将从调用返回的值传递给getpid(2)将对线程组的主线程的属性进行操作。 (如果使用的是POSIX线程API,请使用pthread_setschedparam(3),pthread_getschedparam(3)和pthread_setschedprio(3),而不是sched _ *(2)系统调用。)

BUGS

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_setrfinity(2),sched_setaffinity sched_setparam(2),sched_yield(2),setpriority(2),功能(7),cpuset(7),sched(7)

出版信息

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