Linux内核分析之进程管理-13
第13章 CFS 完全公平调度器详解
基于 Linux 6.12.38 源码分析
13.1 CFS 设计理念
13.1.1 完全公平的概念
传统调度器的问题:
- 基于时间片的调度器需要维护复杂的时间片计算
- 优先级静态,无法动态调整
- 进程数增多时时间片变短,上下文切换开销增大
CFS 的解决方案:
- 没有传统意义上的时间片概念
- 基于虚拟运行时间 (vruntime) 进行调度
- vruntime 最小的任务优先获得 CPU
13.1.2 理想公平模型
1 | 理想公平调度器模型: |
13.1.3 CFS 核心思想
1 | /* |
13.2 调度实体 (sched_entity)
13.2.1 数据结构
位置: include/linux/sched.h
1 | struct sched_entity { |
13.2.2 权重计算
1 | // kernel/sched/core.c |
13.2.3 权重到优先级的转换
1 | /* |
13.3 虚拟运行时间 (vruntime)
13.3.1 vruntime 更新
位置: kernel/sched/fair.c
1 | /* |
13.3.2 vruntime 更新流程
1 | /* |
13.4 CFS 运行队列
13.4.1 cfs_rq 结构
位置: kernel/sched/sched.h
1 | /* CFS 运行队列 */ |
13.4.2 红黑树组织
1 | CFS 运行队列红黑树结构: |
13.4.3 入队操作
1 | /* |
13.5 任务选择
13.5.1 pick_next_entity
位置: kernel/sched/fair.c
1 | static struct sched_entity *pick_next_entity(struct rq *rq, |
13.5.2 唤醒抢占检查
1 | /* |
13.6 时间片分配
13.6.1 目标延迟
位置: kernel/sched/fair.c
1 | /* |
13.6.2 计算时间片
1 | /* |
13.7 负载计算
13.7.1 load_weight 结构
1 | struct load_weight { |
13.7.2 权重更新
1 | /* |
13.8 组调度 (CFS Group Scheduling)
13.8.1 任务组
1 | struct task_group { |
13.8.2 层级结构
1 | 任务组层级结构: |
13.9 常用调优参数
13.9.1 /proc/sys/kernel 参数
1 | # 基础时间片 (纳秒) |
13.9.2 cgroup 控制
1 | # 设置 CPU 份额 |
13.10 本章小结
本章详细介绍了 Linux CFS 完全公平调度器:
- 设计理念:基于 vruntime 的完全公平调度
- 调度实体:sched_entity 结构与权重计算
- 虚拟时间:vruntime 的更新与计算
- 运行队列:红黑树组织与管理
- 任务选择:pick_next_entity 与抢占机制
- 时间片分配:目标延迟与动态计算
- 负载计算:load_weight 与优化技巧
- 组调度:任务组层级结构
下一章将介绍 EEVDF 调度器的实现。
- Title: Linux内核分析之进程管理-13
- Author: 韩乔落
- Created at : 2026-01-14 19:20:43
- Updated at : 2026-01-19 13:40:20
- Link: https://jelasin.github.io/2026/01/14/Linux内核分析之进程管理-13/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments