14 Star 80 Fork 38

aosp-riscv / working-group

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
20230802-linux-sched-api.md 4.80 KB
一键复制 编辑 原始数据 按行查看 历史
unicornx 提交于 2023-07-29 10:13 . add article task priority

文章标题:笔记:Linux 任务调度相关 API 总结

本笔记主要是总结了 Linux 上提供的用于设置任务调度的 API。

1. 参考文档

2. 设置调度策略(policy)和优先级(priority)

先简单总结一下:

API 是否 POSIX
nice
setpriority/getpriority
sched_setscheduler/sched_getscheduler 是 (注:SCHED_BATCH and SCHED_IDLE 不是 POSIX 定义的,是 Linux 自己定义的)
sched_setattr/sched_getattr

2.1. nice

NAME
       nice - change process priority

SYNOPSIS
       #include <unistd.h>

       int nice(int inc);

nice 这个名字有点意思,inc 取值范围 [-20, +19],这个值越低导致任务的优先级越高,值越高任务优先级越低。可以这么理解,给的 inc 值越高越 nice,说明最终的任务 “脾气越好”,因为此时任务优先级越低,越容易被其他高优先级的任务抢占,让出 cpu。

一般情况下,如果要设置一个负数 inc,即提高任务的优先级需要特权权限。

命令行的命令有 nice 和 renice,但是 API 只有 nice。命令行的 nice 和 renice 内部都是通过调用 nice() 实现的。

2.2. setpriority/getpriority

man 2 setpriority

NAME
       getpriority, setpriority - get/set program scheduling priority

SYNOPSIS
       #include <sys/time.h>
       #include <sys/resource.h>

       int getpriority(int which, id_t who);
       int setpriority(int which, id_t who, int prio);

nice() 的等价实现,但是扩展了 nice() 的功能。

2.3. sched_setscheduler/sched_getscheduler

NAME
       sched_setscheduler, sched_getscheduler - set and get scheduling policy/parameters

SYNOPSIS
       #include <sched.h>

       int sched_setscheduler(pid_t pid, int policy,
                              const struct sched_param *param);

       int sched_getscheduler(pid_t pid);

进一步增强,可以设置 policy,当前支持的 policy 包括:

  • "normal" (i.e., non-real-time) scheduling policies
    • SCHED_OTHER
    • SCHED_BATCH
    • SCHED_IDLE
  • "real-time" policies
    • SCHED_FIFO
    • SCHED_RR

设置 priority 时:

  • "normal" (i.e., non-real-time) scheduling policies:只能设置 priority 为 0
  • "real-time" policies:

    This is a number in the range returned by calling sched_get_priority_min(2) and sched_get_priority_max(2) with the specified policy. On Linux, these system calls return, respectively, 1 and 99. 这个值越大优先级越高。

2.4. sched_setattr/sched_getattr

man 2 sched_setattr

NAME
       sched_setattr, sched_getattr - set and get scheduling policy and attributes

SYNOPSIS
       #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_setscheduler/sched_getscheduler 的进一步增强:

当前支持的 policy 包括:

  • "normal" (i.e., non-real-time) scheduling policies
    • SCHED_OTHER
    • SCHED_BATCH
    • SCHED_IDLE
  • "real-time" policies
    • SCHED_FIFO
    • SCHED_RR
  • deadline scheduling policy(Linux 特供)
    • SCHED_DEADLINE

设置 priority 时:

  • "normal" scheduling policies:可以通过 sched_attr.sched_nice 针对 SCHED_OTHER 或者 SCHED_BATCH 设置优先级,范围是 -20 (high priority) to +19 (low priority); SCHED_IDLE 不需要设置 priority。
  • "real-time" policies:可以通过 sched_attr.sched_priority 针对 SCHED_FIFO 或者 SCHED_RR 设置优先级,范围根据 sched_get_priority_min(2) and sched_get_priority_max(2) 获取;
  • deadline scheduling policy:SCHED_DEADLINE 不需要设置 priority,但有其他参数需要额外设置,譬如 sched_runtime/sched_deadline/sched_period

2.5. sched_get_priority_max/sched_get_priority_min

辅助 API,参考 sched_setscheduler/sched_getscheduler 中的描述。

3. 其他(未总结)

  • sched_rr_get_interval

  • sched_yield

  • sched_setaffinity/sched_getaffinity

1
https://gitee.com/aosp-riscv/working-group.git
git@gitee.com:aosp-riscv/working-group.git
aosp-riscv
working-group
working-group
master

搜索帮助