news 2026/5/10 0:45:06

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/2 6:35:22

测试文章标题02

测试文章内容这是一篇测试文章

作者头像 李华
网站建设 2026/5/6 6:45:15

3步搞定Editly Docker部署:告别复杂配置的视频编辑新体验

3步搞定Editly Docker部署:告别复杂配置的视频编辑新体验 【免费下载链接】editly Slick, declarative command line video editing & API 项目地址: https://gitcode.com/gh_mirrors/ed/editly 还在为视频编辑工具的繁琐安装而头疼吗?Editly…

作者头像 李华
网站建设 2026/4/23 9:38:17

清华镜像站同步更新|Qwen-Image模型国内高速下载通道开放

清华镜像站同步更新|Qwen-Image模型国内高速下载通道开放 在AIGC浪潮席卷全球的今天,图像生成技术早已不再是实验室里的概念玩具。从电商海报到影视分镜,从品牌设计到教育插图,文生图模型正以前所未有的速度渗透进各行各业。然而…

作者头像 李华
网站建设 2026/5/3 7:13:46

AI Agent的跨模态检索:整合LLM与多媒体数据库

AI Agent的跨模态检索:整合LLM与多媒体数据库关键词:AI Agent、跨模态检索、大语言模型(LLM)、多媒体数据库、信息整合摘要:本文聚焦于AI Agent的跨模态检索,探讨如何将大语言模型(LLM&#xff…

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

AI赋能电商运营新思维

AI赋能电商运营新思维 关键词:AI、电商运营、新思维、数据分析、个性化推荐 摘要:本文深入探讨了AI如何为电商运营带来新思维。通过对AI在电商领域的核心概念、算法原理、数学模型等方面的详细剖析,结合实际项目案例,阐述了AI在电…

作者头像 李华
网站建设 2026/5/1 16:45:58

ionic 单选框详解

ionic 单选框详解 引言 在移动应用开发中,单选框是一种常见的用户界面元素,用于让用户从一组选项中选择一个选项。在Ionic框架中,单选框的创建和使用非常灵活,能够满足不同场景下的需求。本文将详细介绍Ionic单选框的用法、属性和注意事项。 一、单选框的基本用法 在Io…

作者头像 李华