下面我给你一个 清晰、准确、面向最新 Linux 内核(5.x~6.x)的解释 。
你的三个问题分别是:
- 最新的 Linux 内核是否仍然用 CFS 调度普通进程?
- 是不是一个进程指定一种调度器?
- CFS 与实时调度器(RT scheduler)的关系是什么?
我逐条解释。
✅ 1. 最新 Linux 内核是否仍然使用 CFS?
是的。
在 Linux 6.x 内核中(包括最新的 6.10 LTS),Linux 仍然采用:
- **CFS(Completely Fair Scheduler)**作为 普通任务(normal tasks) 的主调度器
对应调度策略:SCHED_NORMAL(SCHED_OTHER) 和 SCHED_BATCH
CFS 仍然是桌面 Linux、服务器 Linux 中绝大多数进程使用的调度器。
✔ CFS = 默认调度器,一直在维护和优化
✅ 2. 一个进程是否"指定"一种调度器?
不是直接指定调度器,而是指定调度策略(policy)。
调度策略由内核映射到具体调度器。
用户态只能设置:
SCHED_OTHER/SCHED_NORMALSCHED_BATCHSCHED_IDLESCHED_FIFOSCHED_RR- (新)
SCHED_DEADLINE
✔ policy → 内核选定对应的调度器
| 调度策略(policy) | 使用的调度器 | 说明 |
|---|---|---|
| SCHED_NORMAL(SCHED_OTHER) | CFS | 默认普通进程 |
| SCHED_BATCH | CFS | 批处理,权重较低 |
| SCHED_IDLE | CFS idle 调度类 | 极低优先级 |
| SCHED_FIFO | RT 调度器 | 实时 |
| SCHED_RR | RT 调度器 | 实时(轮转) |
| SCHED_DEADLINE | Deadline 调度器 | 最强实时、按调度参数保证 |
🔹 所以,进程并不直接选择 CFS 或 RT 调度器。
🔹 它选择 policy,policy 决定属于哪个调度器类(sched_class)。
✅ 3. CFS 与实时调度器(RT scheduler)的关系是什么?
Linux 调度器内部不是一个调度器,而是一个 调度器类链表(scheduler class):
stop_sched_class
deadline_sched_class
rt_sched_class
fair_sched_class <-- CFS
idle_sched_class
调度决策遵循以下优先级:
stop > deadline > rt > fair(CFS) > idle
所以关系是:
- 最高优先级:实时/硬实时(SCHED_DEADLINE / SCHED_FIFO / SCHED_RR)
- 其次才是:普通任务(CFS)
- 最后是:空闲级别(SCHED_IDLE)
简化理解:
优先运行 RT > CFS
✔ RT 任务一定会抢占 CFS 任务
✔ CFS 任务永远不阻塞 RT 任务
✔ Deadline 调度比 RT 更强,是硬实时
🔥 最简单的总结(必记)
1. 最新 Linux 内核仍然使用 CFS 作为主要 CPU 调度器
2. 进程不是直接选调度器,而是选调度策略(policy)
3. Linux 有多种调度器并存,按优先级排:
Deadline > RT(FIFO/RR) > CFS > Idle
如果你需要,我还能继续解释:
- 如何在 Linux 中把进程切换成 RT 任务(例子:chrt)
- CFS 的 vruntime 是怎么确保公平的
- RT 调度器如何避免任务饿死
- Deadline 调度器的参数 runtime/period/deadline
你接下来想深入哪个?