好的,我来系统地解释一下 CFS(Completely Fair Scheduler,完全公平调度器) _ 这是 Linux 默认的进程调度器,从 2.6.23 内核开始引入,用于调度 普通进程(非实时进程).
传统调度器(O(1) 调度器)在面对大量进程时,容易出现 不公平 或 交互延迟高 的问题。 CFS 的目标是:
CFS 不再使用时间片(timeslice)+ 优先级队列,而是基于一个 理想的"完全公平队列"模型:
vruntime,表示它消耗的 CPU 时间(按权重归一化).vruntime 越大。vruntime 的速度更慢,相当于它能多占 CPU.数学上:
vruntime += 实际运行时间 × (NICE_0_LOAD / 进程权重)vruntime 排序,存放在一棵红黑树中。vruntime 最小的进程(即最"亏欠"CPU 时间的进程).vruntime 最小的进程(最左节点).vruntime(越高说明它"用得越多").vruntime 最小的进程。这样一来:
vruntime 会尽量保持接近。vruntime 比较小,因此能更快被调度(响应性更好).sched_latency_ns:调度周期(所有进程应在此周期内都执行一次).sched_min_granularity_ns:最小时间片(防止进程切换过于频繁).sched_wakeup_granularity_ns:唤醒粒度,避免频繁抢占。可以在 /proc/sys/kernel/ 下查看或通过 sysctl 调整。
CFS 就像是给每个进程发放一个 账本 (vruntime),谁"花的少"谁就优先获得 CPU;谁"花的多"就暂时靠后。 这种方式既保证了公平性,又能让交互型任务更快得到响应。
要不要我帮你画一个 红黑树调度示意图(几个进程的 vruntime 变化过程),让你更直观地理解 CFS 是怎么选择下一个进程的?