【实时Linux核心技术:从概念到实战】04:调度算法对决:SCHED_FIFO/SCHED_RR与普通调度器
【实时Linux核心技术:从概念到实战】04:调度算法对决:SCHED_FIFO/SCHED_RR与普通调度器摘要:在汽车电子、工业控制、机器人等场景里,一个控制回路的延迟抖动就可能引发灾难。Linux内核默认的完全公平调度器(CFS)追求整体吞吐量上“谁也不吃亏”的公平,而实时调度策略SCHED_FIFO和SCHED_RR追求的则是确定性的响应。它们与普通调度器共存于同一内核,但遵循的规则可以说完全不在一个维度。本文从优先级模型、抢占机制、优先级反转、内核节流保护一路讲到实战配置,结合Mermaid调度时序图、C代码实例和chrt/cyclictest等工具演示,把三种调度策略的差别和协作方式掰开揉碎讲清楚。读完你不仅能理解为什么实时任务可以随时“霸占”CPU,还会掌握如何设计优先级拓扑、配置优先级继承、利用实时节流保住系统底线,真正拿到一套可落地的设计方法论。文中少不了踩坑经验——我就吃过优先级继承没开的亏,导致整个控制系统周期抖动超过100毫秒。优质专栏欢迎订阅!【OpenClaw从入门到精通】【DeepSeek深度应用】【Python高阶开发:AI自动化与数据工程实战】【YOLOv11工业级实战】【机器视觉:C# + HALCON】【软件设计师·软考50讲通关|从零基础到工程师职称】【人工智能之深度学习】【AI 赋能:Python 人工智能应用实战】【数字孪生与仿真技术实战指南】【YOLOv8/v9/v10 实战与工业部署】【C#工业上位机高级应用:高并发通信+性能优化】【Java生产级避坑指南:高并发+性能调优终极实战】【Coze搞钱实战:零代码打造吸金AI助手】【YOLO26核心改进+场景落地实战宝典】【OpenClaw企业级智能体实战】文章目录【实时Linux核心技术:从概念到实战】04:调度算法对决:SCHED_FIFO/SCHED_RR与普通调度器1. 调度器的两条路线:公平与确定性2. 实时优先级模型:1-99的数字游戏3. SCHED_FIFO 与 SCHED_RR 的调度规则3.1 SCHED_FIFO:先到先得,绝不装友善3.2 SCHED_RR:时间片轮转,公平一小撮3.3 调度时序图示例4. 实时任务与CFS任务的共存机制5. 优先级反转与优先级继承协议5.1 什么是优先级反转5.2 普通互斥锁的不足5.3 rtmutex与优先级继承5.4 用户态互斥锁启用PIP6. 实时节流:防饿死机制6.1 问题:实时任务可能让系统“卡死”6.2 内核节流参数6.3 如何调整6.4 调参实践与监控6.5 陷阱:多核场景下的节流是 per-CPU7. 实践:配置调度策略(从命令到代码)7.1 用 chrt 工具操作7.2 使用 sched_setscheduler 系统调用(C代码)7.3 查看实时调度统计8. 典型模式:高优先级采集 + 低优先级处理8.1 设计思路8.2 伪代码扩展8.3 实测效果9. 设计原则与最佳实践9.1 优先级拓扑:把关键任务往高处放9.2 尽量避免在实时线程里做可能阻塞的事9.3 善用监控和调试工具9.4 理解内核抢占配置9.5 常见问题与解决10. 总结与展望1. 调度器的两条路线:公平与确定性内核的设计者弄出了一个多调度类(Scheduling Class)的框架,每个任务在创建时就会被标记属于某一个调度类。调度器在选择下一个要跑的任务时,会按照固定的优先级顺序:stop → dl → rt → fair → idle。这个顺序是死的,任务只能在自己所属的那一层跟同级“内卷”,跨层的话,低层的根本就没有机会。我们来画一张调度类层次图,帮你建立直观印象:是否是否是否是否调度器 pick_next_taskstop调度类最高优先级,系统操作有任务?执行任务dl调度类Deadline调度有任务?rt调度类SCHED_FIFO / SCHED_RR有任务?fair调度类CFS, SCHED_OTHER有任务?idle调度类最低优先级空转从这张图你就看出来了,rt类哪怕只有一个优先级为1的任务处于可运行状态,fair类的所有CFS任务都只能在旁边干瞪眼。这种硬性的等级制,就是实时调度的“霸道”根本。当然,霸道的另一面就是饿死普通任务,后面我们会看到内核用什么手段来兜底。CFS在干什么?普通调度器(fair类)沿用的是CFS算法,它的目标是为每个任务公平分配CPU时间。它不关心谁先来、谁更急,只关心在宏观时间尺度上每个任务的虚拟运行时间尽量拉平。这么做在桌面和服务器上是非常牛的,但对于控制周期为500微秒的运动控制器,CFS可能会把该周期任务调度延迟个几十毫秒——因为此时可能正有数据库的日志刷盘线程在和它公平竞争。所以说,实时任务没法接受这种“平均意义上的公平”,它们要的是“我就得在这个时间窗内上CPU”。2. 实时优先级模型:1-99的数字游戏实时优先级是1到99之间的整数,数字越大优先级越高。普通任务的nice值范围是-20到19,但这个优先级只在fair类内部作计算虚拟时间的权重用。内核在管理任务时,用一个统一的prio字段表示调度优先级,类型如下:任务类型prio范围说明实时任务 (rt_priority 0)0 ~ 99但实际上prio会被调整为MAX_RT_PRIO - 1 - rt_priority,使得最终数值越小优先级越高,好让调度器按顺序快速选出普通任务100 ~ 139对应nice值-20~19的映射,同样数值越小越优先即便你看top时,核心只分“rt优先级”和“nice值”两类,但这背后的映射机制决定了只要rt_priority非零,该任务的prio肯定在99以内,从而在调度类比较中直接干翻所有CFS任务。你可以用ps -eL -o pid,tid,cls,rtprio,comm查看到线程的实时优先级。比如我手头一个采集进程的输出:PID TID CLS RTPRIO COMMAND 1123 1123 RR 50 data_collector 1123 1124 FF 80 data_proc_rt 1123 1125 TS - data_loggerCLS列:FF就是SCHED_FIFO,RR是SCHED_RR,TS表示SCHED_OTHER(基于时间片,也就是CFS)。RTPRIO显示的是实时优先级数值。设计的时候,你需要根据任务的截止期和重要性,给出一套合理的优先级拓扑(我们会在第9节专门聊这个)。3. SCHED_FIFO 与 SCHED_RR 的调度规则3.1 SCHED_FIFO:先到先得,绝不装友善SCHED_FIFO是一种“跑起来就不松手”的调度方式。它的规则简单粗暴:一个SCHED_FIFO任务一旦变为可运行状态,如果它优先级大于当前正执行的任务,就直接把对方踢飞,自己上CPU。上CPU之后,只有以下条件之一发生才会被换下:主动阻塞:比如调用sleep、等待信号量、读I/O等;主动放弃CPU:调用sched_yield();被更高优先级的实时任务抢占;进程终止。没有时间片这个概念。也就是说,如果存在两个同是优先级60的SCHED_FIFO任务,先跑的那个会一直霸占CPU不放,后面的那个只能等前者阻塞或主动放弃——这种“静坐”多数情况下是设计缺陷,除非你刻意用阻塞来做同步。3.2 SCHED_RR:时间片轮转,公平一小撮SCHED_RR在SCHED_FIFO基础上增加了同优先级时间片轮转。内核维护每个实时优先级的运行队列,一个SCHED_RR任务默认每次能连续跑的时间由/proc/sys/kernel/sched_rr_timeslice_ms决定,一般是100毫秒。时间片用完后,任务被甩到同优先级队列的末尾,换下一个同优先级RR任务执行。还是拿之前那个场景,如果你把两个优先级60的任务都设为SCHED_RR,那它们就会交替运行,每个最多跑100ms。这种轮转让同优先级的实时任务不至于相互饿死,但注意,这种“公平”仅限实时同类内部,CFS任务依然完全得不到CPU。3.3 调度时序图示例为了给你一个直观感受,我们画一张多任务混合的时序图。假设系统中有:Task A:SCHED_OTHER(CFS),普通优先级,始终可运行。Task B:SCHED_FIFO,优先级50。Task C:SCHED_RR,优先级50。Task D:SCHED_FIFO,优先级80。用Mermaid画个简化时序(注意这里描述的不是内核级别精确的逐微秒切换,而是宏观行为):DC

相关新闻

Quantego:多款 IBM 量子计算机乐高模型登场,含搭建说明与数字设计文件!

Quantego:多款 IBM 量子计算机乐高模型登场,含搭建说明与数字设计文件!

Quantego:多款 IBM 量子计算机乐高模型来袭,含搭建说明、零件清单与数字设计文件! Quantego 是一系列 IBM 量子计算机的乐高模型。2021 年 12 月和 2022 年 4 月,Mathilda Lahmann 在领英提及创造了其第一个版本,相关链…

2026/10/6 3:50:04 阅读更多 →
桶排序python版

桶排序python版

桶排序 适合非负数list [5,3,5,2,8] index_max max(list) # 索引代表待排序的非负数 # 创建(index_max 1) 个桶,桶编号就是buckets的索引值 buckets [[] for i in range(index_max 1)]for i in list:buckets[i].append(i) # 将待排…

2026/10/9 7:50:43 阅读更多 →
MySQL 的存储引擎有哪些?它们之间有什么区别?

MySQL 的存储引擎有哪些?它们之间有什么区别?

面试官考点分析: 基础认知: 考察候选人对 MySQL 架构的理解,是否清楚存储引擎是插件式的,以及它与 Server 层的关系。核心特性对比: 能否准确说出 InnoDB、MyISAM、Memory 等常见引擎在事务支持、锁粒度、索引结构、外…

2026/10/15 12:44:32 阅读更多 →

最新新闻

前缀和与差分:从Sn到an,一篇文章讲透区间操作核心算法

前缀和与差分:从Sn到an,一篇文章讲透区间操作核心算法

刷算法题的时候,我经常看到有人一遇到“前缀和”“差分”就开始头皮发麻。原因倒也好理解:这两个词听起来像两座大山,好像没学过高等数学就翻不过去。但我想说,你真的被名字唬住了。这俩东西,本质就是你高中数列里天天…

2026/10/15 21:42:56 阅读更多 →
RESTful接口设计工程实践:从资源命名到落地规范

RESTful接口设计工程实践:从资源命名到落地规范

我到现在都记得刚带第一个中型项目的时候,前后端一起联调,光接口文档就维护了三个版本:后端自己写的接口说明、前端总结的字段字典、客户端团队小群里私下补的备注。每次产品提需求,大家第一反应不是讨论功能,而是问“…

2026/10/15 21:42:56 阅读更多 →
C#数据库增删改查实战:Access与SQL Server双路径落地

C#数据库增删改查实战:Access与SQL Server双路径落地

简介:本资源是一份面向C#初学者与ASP.NET入门开发者的数据库基础操作教学代码包,聚焦增删改查(CRUD)核心能力训练。内容以完整可运行的C#源码为主,涵盖OleDbConnection连接Access数据库、OleDbCommand执行参数化SQL语句…

2026/10/15 21:42:56 阅读更多 →
TensorFlow 2多算法对比:文本分类实战与选型指南

TensorFlow 2多算法对比:文本分类实战与选型指南

1. 文本分类这件事,为什么值得把多个算法放在一起跑文本分类算是自然语言处理里最接地气的一类任务了。情感分析、垃圾内容识别、工单自动路由、新闻频道归类,本质上都是把一段文本映射到一个预定义的类别标签上。很多刚入门的朋友跑通一个模型、看到准确…

2026/10/15 21:42:56 阅读更多 →
WOA-VMD鲸鱼算法优化变分模态分解:参数自动搜索与Python实现

WOA-VMD鲸鱼算法优化变分模态分解:参数自动搜索与Python实现

简介:本资源面向计算机、电子信息工程、数学等专业的学生与研究人员,提供一套Matlab实现的WOA-VMD鲸鱼算法优化变分模态分解完整方案,可用于课程设计、期末大作业与毕业设计,也适合作为信号处理方向的创新点。资源利用鲸鱼优化算法…

2026/10/15 21:42:56 阅读更多 →
YOLO-World开放词汇检测实战:架构拆解、训练策略与部署避坑指南

YOLO-World开放词汇检测实战:架构拆解、训练策略与部署避坑指南

简介:这份PDF资料聚焦YOLO-World开放词汇对象检测器的实现方式,面向已具备YOLO基础、希望深入理解视觉语言建模与跨模态检测的算法工程师和研究者。内容围绕架构组成、训练与预训练、推理过程及性能表现展开,重点讲解YOLO检测器、CLIP文本编码…

2026/10/15 21:41:56 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →