Contents

Linux内核调度系统调用

内核最新的调度策略宏

#define SCHED_NORMAL    0   // 普通时间共享任务(CFS)
#define SCHED_FIFO      1   // 实时 FIFO
#define SCHED_RR        2   // 实时轮转
#define SCHED_BATCH     3   // 批处理任务
#define SCHED_IDLE      5   // 空闲任务
#define SCHED_DEADLINE  6   // 截止期调度

重新梳理 Linux 用户态相关的调度系统调用,包括 作用、参数意义、返回值,以及内核内部逻辑。


1️⃣ sched_setscheduler

SYSCALL_DEFINE3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param)

功能

  • 设置进程调度策略 (policy) 和实时优先级 (sched_priority)。

  • 支持:

    • SCHED_NORMAL(普通任务 / CFS)
    • SCHED_FIFO / SCHED_RR(实时任务)
    • SCHED_BATCH(批处理)
    • SCHED_IDLE(空闲任务)
  • 不支持:

    • SCHED_DEADLINE(截止期任务)

参数

参数类型说明
pidpid_t目标进程 PID,0 表示当前进程
policyint调度策略宏,上表所示
paramstruct sched_param __user *实时任务优先级 (1~99),非实时任务忽略

返回值

  • 0 成功
  • <0 错误码,如 -EINVAL-EPERM-ESRCH

内核逻辑

sched_setscheduler()
  └── do_sched_setscheduler(pid, policy, param)
        ├── 权限检查
        ├── find_task_by_pid(pid)
        ├── __sched_setscheduler()
        ├── 调度类处理:
        │     - CFS: fair_sched_class
        │     - RT: rt_sched_class
        │     - Deadline: dl_sched_class
        └── 更新 task_struct->policy 和 rt_priority

2️⃣ sched_setparam

SYSCALL_DEFINE2(sched_setparam, pid_t, pid, struct sched_param __user *, param)

功能

  • 修改指定进程的实时优先级,不改变调度策略。
  • 仅对 SCHED_FIFO 或 SCHED_RR 有效。

参数

参数说明
pid进程 PID
paramsched_priority 实时优先级

内核逻辑

  • 调用:
do_sched_setscheduler(pid, SETPARAM_POLICY, param)
  • SETPARAM_POLICY 表示只修改优先级,策略不变。

3️⃣ sched_setattr

SYSCALL_DEFINE3(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr, unsigned int, flags)

功能

  • 设置扩展调度属性(sched_attr),支持:

    • 策略、实时优先级
    • Deadline 参数(runtime, period, deadline)
    • CPU utilization clamp(uclamp)

参数

参数说明
pid目标进程 PID
uattr用户态 sched_attr 结构体
flags保留,未来扩展用

内核逻辑

  1. 复制用户态 sched_attr 到内核态
  2. find_task_by_pid(pid)
  3. 调用 sched_setattr(task_struct, &attr)
  4. 根据策略调用调度类修改 task_struct

4️⃣ sched_getscheduler

SYSCALL_DEFINE1(sched_getscheduler, pid_t, pid)

功能

  • 获取进程调度策略(policy)。

参数

参数说明
pid目标进程 PID

返回值

  • 调度策略宏,如:

    • SCHED_NORMAL / SCHED_FIFO / SCHED_RR / SCHED_BATCH / SCHED_IDLE / SCHED_DEADLINE
  • 错误码:-EINVAL / -ESRCH

内核逻辑

find_task_by_pid(pid)
security_task_getscheduler(task)
返回 task->policy | (task->sched_reset_on_fork ? SCHED_RESET_ON_FORK : 0)

5️⃣ sched_getparam

SYSCALL_DEFINE2(sched_getparam, pid_t, pid, struct sched_param __user *, param)

功能

  • 获取进程的实时优先级 (sched_priority)。
  • 对非实时任务返回 0。

参数

参数说明
pid目标进程 PID
param用户态指针,用于存放返回的 sched_param

内核逻辑

  • 查找任务
  • 如果实时任务,返回 task_struct->rt_priority
  • 否则返回 0

6️⃣ sched_getattr

SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr, unsigned int, usize, unsigned int, flags)

功能

  • 获取扩展调度属性,包括策略、实时优先级、deadline、nice、uclamp。

参数

参数说明
pid目标进程 PID
uattr用户态指针,用于返回 sched_attr
usize用户态结构体大小,兼容不同版本
flags保留

7️⃣ sched_setaffinity / sched_getaffinity

功能

  • 设置 / 获取进程 CPU 亲和性。

参数

参数说明
pid目标进程 PID
lenCPU mask 长度(字节)
user_mask_ptr用户态指针,CPU 位掩码

返回值

  • 成功:0 / CPU mask 长度
  • 失败:错误码

8️⃣ sched_yield

SYSCALL_DEFINE0(sched_yield)

功能

  • 当前进程放弃 CPU,调度器重新选择下一个任务运行。

9️⃣ sched_get_priority_max / sched_get_priority_min

功能

  • 返回指定策略的最大 / 最小实时优先级。
策略最大 RT 优先级最小 RT 优先级
SCHED_FIFO991
SCHED_RR991
SCHED_NORMAL / SCHED_BATCH / SCHED_IDLE / SCHED_DEADLINE00

🔟 sched_rr_get_interval

功能

  • 获取 SCHED_RR 的时间片长度。
  • 时间片为 0 表示无限。

参数

参数说明
pid目标进程 PID
interval用户态指针,用于返回时间片(timespec)

总结

系统调用功能关键参数返回值内核逻辑
sched_setscheduler设置策略 + 优先级pid, policy, sched_param0 / 错误码do_sched_setscheduler → __sched_setscheduler → 调度类
sched_setparam修改优先级pid, sched_param0 / 错误码do_sched_setscheduler(SETPARAM_POLICY)
sched_setattr扩展调度设置pid, sched_attr0 / 错误码sched_setattr → 调度类
sched_getscheduler获取策略pidpolicy / 错误码task_struct->policy
sched_getparam获取实时优先级pid, sched_param0 / 错误码task_struct->rt_priority
sched_getattr获取扩展属性pid, sched_attr0 / 错误码task_struct->sched_attr
sched_setaffinity设置 CPU 亲和性pid, mask0 / 错误码sched_setaffinity
sched_getaffinity获取 CPU 亲和性pid, maskmask 长度 / 错误码sched_getaffinity
sched_yield放弃 CPU-0do_sched_yield()
sched_get_priority_max/min最大/最小 RT 优先级policyint / 错误码宏定义
sched_rr_get_intervalRR 时间片pid, timespec0 / 错误码sched_rr_get_interval()