随想3:关于语音采集线程 使用 CFS 调度或者 SCHED_FIFO 的思考

在我之前做语音采集相关的项目时,遇到系统的实时性问题。因为语音采集是整个流水线的起点------如果采集线程被延迟或阻塞,后续的所有处理(比如特征提取、模型推理、语音合成)都会跟着滞后,这种延迟不会被放大,但会直接破坏端到端的实时体验。

为了保障这一点,我把语音采集线程设为高优先级,并采用了 Linux 的 SCHED_FIFO 实时调度策略,而不是默认的 CFS(完全公平调度器)。这是因为:语音采集本质上是 I/O 密集型任务,它大部分时间其实在等待音频设备的数据(比如通过 ALSA),处于阻塞状态;一旦有新数据到达,它需要立刻被唤醒并处理,不能被其他计算密集型任务(比如大模型推理)抢占;而由于它运行时间很短、很快又会主动让出 CPU(回到阻塞状态),即使优先级很高,也不会导致其他线程"饿死" ------相反,它释放 CPU 后,计算线程就能立即接手做预处理或推理。

两种调度器的解释说明:

CFS (完全公平调度器):每个任务按权重(基于 nice 值)公平分配 CPU 时间。使用 虚拟运行时间 来衡量公平性:每个 CPU 维护一个 红黑树,树节点按 vruntime 排序(左子树 vruntime 最小)。调度过程选择下一个任务:总是挑选红黑树最左节点(vruntime 最小,即"最欠 CPU"的任务)。

插入/删除:任务就绪时插入树中,阻塞或退出时移除。复杂度 O(log N)。无固定时间片:任务运行直到 vruntime 超过阈值被抢占,或自愿让出 CPU。

SCHED_FIFO (First-In-First-Out 实时调度策略)

使用优先级队,按优先级扫描最高优先级就绪任务。

调度过程:任务运行直到:自愿让出(yield)、阻塞(I/O 等)、或被更高优先级实时任务抢占。

同优先级任务:严格 FIFO 顺序,不互相抢占(当前运行的任务继续,直到让出)。实时任务总是抢占 CFS 等普通任务。应用场景:

硬实时或软实时任务:需要低延迟、可预测响应,如音频/视频处理、多媒体播放、工业控制、机器人、嵌入式系统。时间关键任务:例如实时数据采集、传感器处理,避免被普通任务中断。

相关推荐
炸膛坦客5 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
旖-旎6 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
Henry Zhu1236 小时前
C++中的特殊成员函数与智能指针
c++
_wyt0019 小时前
多重背包问题详解
c++·背包dp
Ljwuhe9 小时前
C++——多态
开发语言·c++
越甲八千10 小时前
STL stack为何没有迭代器
c++
从零开始的代码生活_11 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸12 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
GIS阵地12 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis
王维同学12 小时前
[原创][Windows C++]LSA 认证、安全与通知包的注册表枚举
c++·windows·安全