内核最新的调度策略宏:
#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)
功能
参数
| 参数 | 类型 | 说明 |
|---|
pid | pid_t | 目标进程 PID,0 表示当前进程 |
policy | int | 调度策略宏,上表所示 |
param | struct 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 |
param | sched_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 | 保留,未来扩展用 |
内核逻辑
- 复制用户态
sched_attr 到内核态 find_task_by_pid(pid)- 调用
sched_setattr(task_struct, &attr) - 根据策略调用调度类修改
task_struct
4️⃣ sched_getscheduler
SYSCALL_DEFINE1(sched_getscheduler, pid_t, 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
功能
参数
| 参数 | 说明 |
|---|
pid | 目标进程 PID |
len | CPU mask 长度(字节) |
user_mask_ptr | 用户态指针,CPU 位掩码 |
返回值
8️⃣ sched_yield
SYSCALL_DEFINE0(sched_yield)
功能
- 当前进程放弃 CPU,调度器重新选择下一个任务运行。
9️⃣ sched_get_priority_max / sched_get_priority_min
功能
| 策略 | 最大 RT 优先级 | 最小 RT 优先级 |
|---|
| SCHED_FIFO | 99 | 1 |
| SCHED_RR | 99 | 1 |
| SCHED_NORMAL / SCHED_BATCH / SCHED_IDLE / SCHED_DEADLINE | 0 | 0 |
🔟 sched_rr_get_interval
功能
- 获取 SCHED_RR 的时间片长度。
- 时间片为 0 表示无限。
参数
| 参数 | 说明 |
|---|
pid | 目标进程 PID |
interval | 用户态指针,用于返回时间片(timespec) |
总结
| 系统调用 | 功能 | 关键参数 | 返回值 | 内核逻辑 |
|---|
sched_setscheduler | 设置策略 + 优先级 | pid, policy, sched_param | 0 / 错误码 | do_sched_setscheduler → __sched_setscheduler → 调度类 |
sched_setparam | 修改优先级 | pid, sched_param | 0 / 错误码 | do_sched_setscheduler(SETPARAM_POLICY) |
sched_setattr | 扩展调度设置 | pid, sched_attr | 0 / 错误码 | sched_setattr → 调度类 |
sched_getscheduler | 获取策略 | pid | policy / 错误码 | task_struct->policy |
sched_getparam | 获取实时优先级 | pid, sched_param | 0 / 错误码 | task_struct->rt_priority |
sched_getattr | 获取扩展属性 | pid, sched_attr | 0 / 错误码 | task_struct->sched_attr |
sched_setaffinity | 设置 CPU 亲和性 | pid, mask | 0 / 错误码 | sched_setaffinity |
sched_getaffinity | 获取 CPU 亲和性 | pid, mask | mask 长度 / 错误码 | sched_getaffinity |
sched_yield | 放弃 CPU | - | 0 | do_sched_yield() |
sched_get_priority_max/min | 最大/最小 RT 优先级 | policy | int / 错误码 | 宏定义 |
sched_rr_get_interval | RR 时间片 | pid, timespec | 0 / 错误码 | sched_rr_get_interval() |