news 2026/6/9 22:34:23

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

作者头像

张小明

前端开发工程师

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

接前一篇文章:Linux CFS(完全公平调度器)原理与实现细节全解析(2)

二、核心概念与关键抽象

2.3 CFS运行队列(cfs_rq)与红黑树

每个CPU都维护一个就绪队列struct rq,其中CFS使用自己的子结构struct cfs_rq管理所有属于CFS调度类的可运行实体。

cfs_rq的核心成员之一是一棵按vruntime排序的红黑树

  • 所有处于TASK_RUNNING状态的sched_entity都在这棵树上;

  • 树中最左节点就是vruntime最小的任务,即下一个最该运行的任务
  • 插入/删除/查找均为 O(log N),在任务数很大时仍然可控。

红黑树的存在,使得CFS可以用非常简洁的逻辑实现:

“永远选择vruntime最小的任务运行”

典型操作如下:

  • enqueue_entity()

新任务就绪 / 唤醒 → 插入rb-tree;

  • dequeue_entity()

任务阻塞 / 退出 → 从rb-tree移除;

  • pick_next_task_fair()

取 rb-tree 最左节点 → 下一个运行任务。

同时,cfs_rq中还维护一个关键字段:

  • min_vruntime

当前运行队列中所有实体vruntime的下界近似值,主要用于新任务vruntime初始化与全局“时间对齐”。

2.4 权重、nice值与调度粒度

在Linux中:

  • nice值范围为[-20, +19],数值越小优先级越高;
  • CFS使用sched_prio_to_weight[]将nice值映射为整数权重weight

  • 权重近似呈指数级变化:每降低1个nice,权重大约乘以1.25。

例如(示意):

  • nice = 0 → weight = 1024;
  • nice = -1 → weight ≈ 1277;
  • nice = +1 → weight ≈ 820。

CFS使用如下公式更新vruntime:

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

因此:

  • 权重越大(nice越低),同样运行1ms,其vruntime增加得更少;
  • 权重越小(nice越高),vruntime增加得更多,在红黑树中更容易被“推到右边”,降低调度频率。

此外,为避免过度频繁的上下文切换,CFS引入了几个重要参数:

  • sched_min_granularity

最小调度粒度(默认约 0.75ms),单次调度不希望明显短于该值;

  • sched_latency

目标调度延迟(默认约 6ms),即当可运行任务数较少时,每个任务在一个周期内大致能运行一次;

  • 当任务数nr_running较多时,sched_latency会按nr_running sched_min_granularity动态放大,以避免极端高频切换。

更多内容请看下回。

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

基于单片机的面部识别电子考勤机的设计

基于单片机的面部识别电子考勤机的设计 第一章 引言 传统考勤方式(如指纹打卡、卡片考勤)存在易造假、卡片丢失、指纹磨损无法识别等问题,难以满足企业、校园等场景的精准考勤需求。面部识别技术凭借唯一性、非接触性、便捷性的优势&#xff…

作者头像 李华
网站建设 2026/6/8 20:02:51

c# DataSet 类

在 C# 的ADO.NET体系中,DataSet是一个内存中的数据容器,可视为 “离线数据库”,用于存储和管理关系型数据(包含表、表关系、约束等),且独立于底层数据源(如 SQL Server、MySQL 等)。…

作者头像 李华
网站建设 2026/6/9 0:40:47

技术演进中的开发沉思-259 Ajax:浏览器历史管理

AJAX 的出现,让前端从 “整页刷新” 迈入 “无刷新交互” 的新时代 —— 表单提交不跳转、列表翻页不卡顿、内容加载无缝衔接。但这份流畅的体验背后,却藏着一个致命的缺陷:浏览器的后退按钮失效、书签无法保存 AJAX 状态。用户点击后退&…

作者头像 李华
网站建设 2026/6/9 3:50:19

20、Linux文件处理与正则表达式实用指南

Linux文件处理与正则表达式实用指南 1. 文件压缩与解压缩工具 在Linux和类Unix系统中, zip 和 unzip 是常用的文件压缩与解压缩工具。不过,它们不能像 tar 那样组合使用进行网络文件复制。但 zip 可以接受标准输入,因此可用于压缩其他程序的输出。 例如,将 ls …

作者头像 李华
网站建设 2026/6/7 2:45:54

25、Linux文本格式化与打印全解析

Linux文本格式化与打印全解析 1. 文本格式化基础 在Linux系统中,文本的格式化和处理是非常重要的操作。 printf 命令可以实现基本的文本格式化。例如: [me@linuxbox ~]$ printf "Line: %05d %15.3f Result: %+15d\n" 1071 3.14156295 32589 Line: 01071 …

作者头像 李华
网站建设 2026/6/8 7:12:46

RAG信息检索基准评测指标的分析和探索

这里从多个角度分析和探索RAG信息检索常用的基准和评测指标。 1 BEIR 1.1 通用检索基准 (BEIR) BEIR是一个用于零样本文本信息检索的标准评估基准。它旨在解决传统模型在单一数据集上评估、难以衡量其真实泛化能力的问题,BEIR集合了18个来自不同任务和领域的公开数…

作者头像 李华