linux进程调度相关头文件sched.h介绍与使用指南
在这篇文章中,我们将详细介绍一下 sched.h
这个文件的内容和作用。
1. sched.h
的位置与背景
- 所在位置:通常在
<sched.h>
(用户态 C 标准库头文件)和 Linux 内核源码中的include/linux/sched.h
。 - 用途:
- 用户态:由 POSIX 定义,提供与 进程调度 相关的 API(如进程的优先级、调度策略等)。
- 内核态:在 Linux 内核中,
include/linux/sched.h
是进程调度和任务管理的核心头文件之一,定义了task_struct
、调度策略、调度类、调度相关宏与内联函数等。
2. 用户态 <sched.h>
(POSIX 标准)
用户态版本的 <sched.h>
主要定义了:
2.1 常量(调度策略)
#define SCHED_OTHER 0 // 普通分时调度
#define SCHED_FIFO 1 // 先入先出实时调度
#define SCHED_RR 2 // 时间片轮转实时调度
#define SCHED_BATCH 3 // 批处理作业
#define SCHED_IDLE 5 // 空闲任务
#define SCHED_DEADLINE 6 // 最早截止时间优先
2.2 数据结构
struct sched_param {int sched_priority; // 实时优先级
};
2.3 函数原型(POSIX API)
int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param);
int sched_getscheduler(pid_t pid);
int sched_getparam(pid_t pid, struct sched_param *param);
int sched_setparam(pid_t pid, const struct sched_param *param);
int sched_yield(void);
int sched_get_priority_max(int policy);
int sched_get_priority_min(int policy);
int sched_rr_get_interval(pid_t pid, struct timespec *tp);
主要作用:
- 控制或获取进程的调度策略 / 优先级。
- 主动让出 CPU(
sched_yield
)。 - 获取不同调度策略的优先级范围。
3. 内核态 include/linux/sched.h
在内核中,sched.h
体积庞大、非常重要,它是 进程管理系统的核心头文件。
3.1 核心内容
-
struct task_struct
- 内核中表示进程(任务)的数据结构,包含了进程的所有信息:
- 进程 ID、父进程/子进程链表
- 调度策略、优先级、权重
- CPU 运行时信息
- 内存管理(
mm_struct
) - 文件系统信息
- 信号处理
- 定时器信息
- 结构体在 Linux 新版本中可能被拆分成多个头文件(如
sched/task.h
)。
- 内核中表示进程(任务)的数据结构,包含了进程的所有信息:
-
调度策略与优先级定义
与用户态类似,但带有更多内核扩展(如实时调度类、Deadline 调度类)。 -
调度类定义 (
struct sched_class
)- 抽象接口,用于实现不同的调度算法(CFS、RT、Deadline、Idle 任务)。
- 每个调度类有自己的操作方法(
enqueue_task
,pick_next_task
,check_preempt_curr
等)。
-
调度相关宏
- 优先级范围:
MAX_RT_PRIO
,DEFAULT_PRIO
- 时间片定义:
RR_TIMESLICE
- 优先级范围:
-
内联函数与辅助工具
- 判断进程状态:
task_is_stopped()
,task_is_traced()
- 获取当前任务:
current
- 判断进程状态:
4. 两者差别总结
方面 | 用户态 <sched.h> | 内核态 include/linux/sched.h |
---|---|---|
属于 | C 库 / POSIX 标准 | Linux 内核源码 |
用途 | 提供进程调度 API 给用户程序调用 | 内核调度器与进程管理的核心定义 |
主要内容 | 调度策略常量、struct sched_param 、sched_* 函数原型 | task_struct 、调度类、调度宏和内核调度器接口 |
可访问性 | 普通进程可直接 #include <sched.h> | 仅能在内核代码中使用 |
5. 常见使用示例(用户态)
#include <stdio.h>
#include <sched.h>
#include <unistd.h>int main() {struct sched_param param;param.sched_priority = 10;if (sched_setscheduler(0, SCHED_RR, ¶m) == -1) {perror("sched_setscheduler");return 1;}printf("Scheduler set to Round Robin with priority %d\n", param.sched_priority);return 0;
}
✅ 总结
<sched.h>
在 用户态 是 POSIX 标准的一部分,给程序提供进程调度 API;- 在 Linux 内核 中是有关调度与进程管理的核心头文件,定义了
task_struct
等内核级关键结构。 - 用户态调用
sched_*
函数会通过系统调用进入内核,最终在内核的调度器中生效。