news 2026/5/15 5:38:50

Linux CFS(完全公平调度器)原理与实现细节全解析(1)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux CFS(完全公平调度器)原理与实现细节全解析(1)

一、背景、动机与设计目标

CFS(Completely Fair Scheduler,完全公平调度器)是Linux内核自2.6.23版本起采用的默认进程调度器,用于替代之前的O(1)调度器。其引入的核心动机在于解决传统调度器在多任务交互场景下公平性不足、响应延迟偏高等问题。

在CFS之前,O(1)调度器虽然具有常数时间复杂度,适合大规模并发,但其基于固定时间片 + 多级优先级数组的设计难以实现真正的“公平”:

  • 高优先级任务可能长期抢占CPU;
  • 低优先级或交互式任务(如桌面应用)容易出现明显卡顿;
  • 调度行为对I/O密集型任务的友好度有限。

随着桌面和服务器负载对交互响应性、公平性、可扩展性的要求不断提高,社区迫切需要一种:

  • 能更合理分配CPU时间
  • 能体现任务优先级
  • 又能保持较好可扩展性与实现简洁性

的新调度机制。

CFS的设计目标正是围绕“完全公平”展开:

(1)摒弃传统时间片

不再为每个任务分配固定时间片,而是引入统一度量 ——虚拟运行时间(vruntime)

(2)按vruntime选任务

调度器总是选择vruntime最小的可运行任务执行,使所有任务在长时间尺度上按权重成比例分享 CPU。

(3)结构简洁、易扩展

利用红黑树管理可运行任务;通过“调度类”(schedule class)机制,为实时调度、批处理调度等扩展预留空间。

(4)良好可扩展性

在任务数高达数千时,仍能保持可接受的调度开销。

二、核心概念与关键抽象

从宏观上看,CFS要解决的问题可以概括为三个核心问题:

(1)“完全公平”在CFS中的具体含义是什么?

(2)CFS如何定义、维护并使用虚拟运行时间(vruntime)来实现这种公平?

(3)CFS如何通过调度实体(sched_entity)+ 运行队列(cfs_rq)+ 红黑树

三者的配合完成实际调度决策?

本节先从整体抽象入手,再逐步深入实现细节。

2.1 “完全公平”的含义与实现近似

CFS所谓的“完全公平”,本质上是一种基于权重的比例公平(proportional fairness)

  • 若系统中有N个权重相同的可运行任务,则每个任务应获得约1/N的CPU时间;
  • 若任务权重不同(由nice值映射),则任务获得的CPU时间应与其权重成正比。

但是现实世界中有几个硬条件:

  • CPU是离散资源,只能一次运行一个任务;
  • 上下文切换存在开销;
  • 任务会频繁睡眠/唤醒、I/O 阻塞、迁移等。

所以CFS采取近似实现

(1)为每个可调度对象维护一个虚拟运行时间vruntime,表示该任务在“公平意义上已经消耗了多少CPU”;

(2)所有可运行任务按vruntime排序,放在一棵红黑树中;

(3)每次调度时,总是选择vruntime最小的任务运行;

(4)任务运行期间,其vruntime按如下公式增长:

[\Delta \text{vruntime} = \Delta t_\text{exec} \times \frac{\text{NICE_0_LOAD}}{\text{weight}}]

vruntime = (runtime * weight * lw->inv_weight) >> WMULT_SHIFT

其中:

  • \Delta t_\text{exec}):实际运行的物理时间;

  • weight:任务权重,由nice值映射;

  • NICE_0_LOAD:nice=0对应的标准权重,一般为1024。

由此可见:

  • 权重越大(优先级越高,nice越小),vruntime增长越慢;
  • 权重越小(优先级越低,nice越大),vruntime增长越快。

长时间看,所有任务的vruntime会趋于“对齐”,从而实现按权重分配CPU时间的比例公平

如果没有vruntime这一层权重归一化,只按物理时间轮转,那么所有任务将几乎平均地分到CPU 时间,优先级语义基本丧失。

更多内容请看下回。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 19:43:39

LobeChat界面美学设计揭秘:为何用户第一眼就爱上它?

LobeChat界面美学设计揭秘:为何用户第一眼就爱上它? 在AI聊天机器人几乎随处可见的今天,打开一个新工具时,你是否曾因为某个界面“特别顺眼”而多停留了几分钟?又或者,仅仅几秒之内,你就决定关掉…

作者头像 李华
网站建设 2026/5/11 1:30:01

UC3842反激式开关电源上电前测试方法

在UC3842反激式开关电源上电前进行测试,主要是为了避免可能的故障和损坏。以下是一些原因:● 避免炸毁UC3842芯片:在上电之前进行测试可以确认UC3842芯片的参数是否符合规范,包括启动电压。若UC3842有故障,可能会在上电…

作者头像 李华
网站建设 2026/5/15 5:30:56

25 岁转行晚了?网安工程师手把手带你入门到精通,来得及!

25岁,转行网络安全工程师来还来得及吗?手把手带你入门到精通,一切都来得及! 25岁,转行网络安全工程师来还来得及吗? 首先说一下这个行业的现状,真正科班出身网络安全专业的很少,因…

作者头像 李华
网站建设 2026/5/14 21:38:15

AXI-A7.4.5 Request attribute restrictions for Atomic transactions

上述是AXI协议中对原子事务请求属性(AWCACHE、AWDOMAIN、AWSNOOP、AWLOCK)的限制规则,主要目的是确保原子操作的正确执行和系统一致性。 1. AWCACHE和AWDOMAIN可以任意组合 规则:原子事务可以使用接口允许的任何AWCACHE(缓存属性)和AWDOMAIN(域属性)组合。 举例: 一…

作者头像 李华
网站建设 2026/5/14 11:47:10

10 个继续教育论文降AIGC工具,AI写作优化推荐

10 个继续教育论文降AIGC工具,AI写作优化推荐 论文路上的“重担”:时间、重复与压力的三重奏 在继续教育的学习旅程中,毕业论文似乎总是伴随着一种难以言喻的焦虑感。无论是为了完成课程要求,还是为了提升个人学术水平&#xff0c…

作者头像 李华
网站建设 2026/5/14 1:24:19

通信系统仿真:数字调制与解调技术_(31).信噪比SNR分析

信噪比SNR分析 1. 信噪比的定义和重要性 信噪比(Signal-to-Noise Ratio, SNR)是通信系统中一个非常重要的参数,用于衡量信号质量。信噪比定义为信号功率与噪声功率的比值,通常表示为分贝(dB)。 1.1 信噪比的…

作者头像 李华