当前位置: 首页 > news >正文

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 时间,优先级语义基本丧失。

更多内容请看下回。

http://www.cnnetsun.cn/news/70380.html

相关文章:

  • Ruby CGI 编程
  • 【直接抄作业】2025 网安工程师入门到精通:零基础全流程(收藏即够用)
  • 8个降AI率工具推荐,本科生开题报告必备
  • C++ 程序流程结构-循环结构-for循环
  • BOE(京东方)发布智能体集群 多智能体协同重塑AI+显示新未来
  • 国产POE降压恒压芯片方案选型:48v-52v输入转5v-12v/1-3A电源芯片
  • 9个研究生论文写作工具,AI工具推荐解决发表难题!
  • 介观交通流仿真软件:Aimsun Next_(1).AimsunNext概述
  • 2011-2025年地级市环境保护关注度(百度搜索指数)数据
  • Poppler Windows版:轻松获取预编译PDF处理工具完整指南
  • 无需高配GPU!FP8量化版SD3.5让文生图成本直降40%
  • (附带word报告)并联型有源电力滤波器APF simulink仿真 利用基于瞬时无功功率理论...
  • Zernike 多项式在圆形、六边形、椭圆形、矩形或环形瞳孔上应用(Matlab代码实现)
  • 如何通过LobeChat提升大模型token的利用率和转化率?
  • GitHub热门Fork项目:用Qwen3-VL-8B实现图片自动打标签
  • 使用Ollama运行Seed-Coder-8B-Base:轻量级代码生成解决方案
  • 企业级部署首选:Stable-Diffusion-3.5-FP8生产环境搭建指南
  • 我开源了一个Markdown转PDF工具
  • Python 基础语法(二):程序流程控制
  • YoloV8 Detect类扩展支持Qwen-Image生成掩码
  • 深度学习视频教程资源合集
  • 9 个课堂汇报 AI 工具,专科生快速生成内容推荐
  • 郭大勇:以安全固根基 共建数字金融新生态
  • CFCA张野解读《2025数字银行调查报告》
  • CFCA刘通:以多维互信的数字身份服务 赋能金融数字化转型
  • 多模态AI前沿:从Agent构建到视频AIGC
  • SQL的导入导出数据和查询
  • 滚动轴承缺陷动力学模型:从理论到实践
  • GG3M (鸽姆) Global Governance Meta-Mind Model: 商业计划书 Global Civilization Governance OS (Eastern Wisdom
  • Comsol微环谐振腔与环形波导耦和:对比波束包络与波动光学两个模块