Linux内核分析之进程管理-05
第5章 进程调度
基于 Linux 6.12.38 源码分析
5.1 调度器架构
5.1.1 调度器设计原则
Linux 调度器采用模块化设计,支持多种调度策略:
- 公平性:确保每个进程获得公平的 CPU 时间
- 高效性:最小化调度开销
- 可扩展性:支持多核 SMP 架构
- 实时性:支持实时任务调度
- 灵活性:支持多种调度策略共存
5.1.2 调度类层次
1 | ┌────────────────────────────────────────────────────────────────┐ |
5.1.3 调度类优先级
位置: kernel/sched/core.c
1 | const struct sched_class stop_sched_class; |
| 调度类 | 优先级 | 策略 | 用途 |
|---|---|---|---|
| stop_sched_class | 最高 | - | 停机/CPU 热迁移 |
| dl_sched_class | 2 | SCHED_DEADLINE | 严格实时任务 |
| rt_sched_class | 3 | SCHED_FIFO/RR | 软实时任务 |
| fair_sched_class | 4 | SCHED_NORMAL/BATCH | 普通进程 |
| idle_sched_class | 最低 | SCHED_IDLE | 空闲任务 |
5.2 运行队列 (Run Queue)
5.2.1 struct rq
位置: kernel/sched/sched.h
1 | /* |
5.2.2 Per-CPU 运行队列
1 | /* Per-CPU runqueues */ |
5.3 完全公平调度器 (CFS)
5.3.1 核心思想
CFS 基于虚拟运行时间 (vruntime) 调度:
- vruntime 越小,表示获得 CPU 时间越少,优先调度
- vruntime 越大,表示已获得较多 CPU 时间,延后调度
- 通过红-黑树维护按 vruntime 排序的任务队列
5.3.2 调度实体
1 | // include/linux/sched.h |
5.3.3 vruntime 计算
1 | // kernel/sched/fair.c |
5.3.4 红-黑树调度队列
1 | CFS 运行队列的红-黑树: |
5.3.5 任务选择
1 | // kernel/sched/fair.c |
5.4 实时调度器
5.4.1 实时策略
1 | // include/linux/sched.h |
5.4.2 实时调度实体
1 | // include/linux/sched.h |
5.4.3 优先级数组
1 | /* |
5.4.4 FIFO vs RR
SCHED_FIFO:
- 先进先出调度
- 任务运行直到主动让出或被更高优先级任务抢占
- 没有时间片概念
SCHED_RR:
- 轮转调度
- 每个任务有时间片
- 时间片用完后重新排队到同优先级队尾
1 | // kernel/sched/rt.c |
5.5 Deadline 调度器
5.5.1 EDF 算法
Deadline 调度器采用最早截止时间优先 (Earliest Deadline First) 算法:
- 每个任务有:运行时间、截止时间、周期
- 调度截止时间最近的任务
- 保证任务在截止时间前完成
5.5.2 Deadline 调度实体
1 | // include/linux/sched.h |
5.5.3 Deadline 运行队列
1 | struct dl_rq { |
5.6 上下文切换
5.6.1 切换流程
1 | // kernel/sched/core.c |
5.6.2 switch_to (x86_64)
1 | /* arch/x86/include/asm/switch_to.h */ |
5.7 schedule() 主调度函数
5.7.1 入口点
1 | // kernel/sched/core.c |
5.7.2 __schedule() 实现
1 | // kernel/sched/core.c:6599 |
5.8 负载均衡
5.8.1 负载均衡时机
- 周期性负载均衡 - 时钟中断触发
- CPU 空闲时 - 本 CPU 没有任务时从其他 CPU 偷任务
- 创建新进程时 - 选择最空闲的 CPU
- CPU 热迁移时 - CPU 下线前迁移任务
5.8.2 PELT 负载跟踪
1 | // Per-Entity Load Tracking |
5.8.3 load_balance()
1 | // kernel/sched/fair.c |
5.9 调度延迟与吞吐量优化
5.9.1 调度延迟
sched_latency_ns - 目标调度延迟
1 | // kernel/sched/debug.c |
sched_min_granularity_ns - 最小调度粒度
1 | unsigned int sysctl_sched_min_granularity = 750000ULL; // 750us |
5.9.2 吞吐量优化
sched_wakeup_granularity_ns - 唤醒粒度
1 | unsigned int sysctl_sched_wakeup_granularity = 1000000ULL; // 1ms |
sched_nr_migrate - 批量迁移任务数
1 | unsigned int sysctl_sched_nr_migrate = 32; |
5.10 本章小结
本章介绍了 Linux 进程调度机制:
- 调度器架构:模块化设计,支持多种调度类
- 运行队列:Per-CPU 运行队列,包含多种调度类的队列
- CFS:基于 vruntime 的完全公平调度,使用红-黑树
- 实时调度:FIFO 和 RR 策略,支持软实时任务
- Deadline 调度:EDF 算法,支持严格实时任务
- 上下文切换:切换地址空间和寄存器状态
- 主调度函数:schedule() 和 __schedule()
- 负载均衡:PELT 负载跟踪和 CPU 间任务迁移
下一章将介绍进程状态与转换。
- Title: Linux内核分析之进程管理-05
- Author: 韩乔落
- Created at : 2026-01-14 19:20:07
- Updated at : 2026-01-19 13:40:43
- Link: https://jelasin.github.io/2026/01/14/Linux内核分析之进程管理-05/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments