news 2026/4/16 11:13: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/4/16 3:00:38

【EVE-NG镜像制作系列教程】29、Cisco Prime Infra

推荐阅读: 1、EVE-NG 2TB全网最新最全镜像下载地址(保持更新): https://www.emulatedlab.com/thread-939-1-1.html 2、EVE-NG 2025全网最新最全资源大全(保持更新): https://www.emulatedlab.co…

作者头像 李华
网站建设 2026/4/16 9:25:30

Windows系统性能革命:OpenSpeedy加速工具全面解析

Windows系统性能革命:OpenSpeedy加速工具全面解析 【免费下载链接】OpenSpeedy 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 你是否经常遇到电脑运行卡顿、程序响应缓慢的问题?在当今快节奏的数字时代,系统性能直接影响…

作者头像 李华
网站建设 2026/4/13 0:30:35

MySQL 处理重复数据

MySQL 处理重复数据 引言 在数据库管理中,数据重复是一个常见的问题。重复数据不仅浪费存储空间,还可能导致数据分析的偏差和错误。MySQL作为一种流行的关系型数据库管理系统,提供了多种方法来处理和消除重复数据。本文将详细介绍MySQL处理重复数据的方法,包括查找重复数…

作者头像 李华
网站建设 2026/4/9 0:32:12

10 个专科生毕业答辩PPT模板,AI格式优化工具推荐

10 个专科生毕业答辩PPT模板,AI格式优化工具推荐 时间紧、任务重,论文写作成了“硬骨头” 对于专科生来说,毕业答辩不仅是学习生涯的终点,更是迈向职场的第一道门槛。而在这条路上,最让人头疼的莫过于撰写毕业论文和制…

作者头像 李华
网站建设 2026/4/16 10:56:51

NPM安装前端界面控制Stable Diffusion 3.5 FP8?Node.js集成方案揭秘

Node.js 集成 Stable Diffusion 3.5 FP8:前端如何驱动本地高性能 AI 在生成式AI迅速“飞入寻常百姓家”的今天,一个看似矛盾的趋势正在浮现:我们既渴望更强大的模型,又希望它能在自己的笔记本上流畅运行。Stable Diffusion 3.5 的…

作者头像 李华
网站建设 2026/4/16 10:55:38

线上充值平台如何实现自动开票?四步落地法,告别人工开票痛点

“充值 1 分钟,开票等半天”—— 这是很多互联网平台、会员制服务、电商平台的共同困扰:线上充值订单源源不断,财务团队却要陷入逐笔核对、手动录入、反复修改的低效循环。人工开票不仅占用大量人力成本,还容易因数据误差、开票延…

作者头像 李华