调度器80—确定性调度


一、什么是确定性调度

确定性调度(Deterministic Scheduling)

1. 定义

确定性调度指调度行为的时间特性是可预测、可保证的——任务能在明确的时间约束内被调度执行,最坏情况延迟(WCET/WCRT)有上界且可计算。

核心不是"快",而是"可预测"——每次都能在承诺的时间内完成,不会出现偶发的长延迟。


2. 确定性 vs 非确定性对比

非确定性调度(如普通 CFS):
  任务响应时间:1ms, 1ms, 1ms, ..., 突然 50ms, ..., 1ms
                                    ↑ 偶发的长延迟(不可预测)
  平均延迟低,但最坏情况无保证

确定性调度:
  任务响应时间:≤ 2ms, ≤ 2ms, ≤ 2ms, ...(始终 ≤ 上界)
  平均延迟可能不是最低,但最坏情况有明确保证


3. 关键特征

----------------------------------------------------------------------------------------
特征             说明
----------------------------------------------------------------------------------------
有界延迟          从任务就绪到被调度执行的时间有明确上界
可预测性          相同输入下调度决策可复现
优先级保证         高优先级任务一定抢占低优先级任务,无优先级反转(或有界反转)
无饥饿            任务不会被无限期推迟
可分析性          能通过数学方法(如响应时间分析 RTA)证明时间约束满足
----------------------------------------------------------------------------------------


4. 为什么普通 Linux CFS 不是确定性的

CFS 追求吞吐量和公平性,不是确定性:

CFS 的不确定性来源:
(1) vruntime 动态计算 → 调度顺序依赖历史运行情况
(2) 负载均衡随时迁移任务 → 延迟波动
(3) 抢占时机受 tick 精度限制 → 抖动
(4) 优先级只是"权重",不是绝对保证 → 低优先级仍能运行
(5) 中断、软中断、内核抢占关闭区间 → 引入不可预测延迟


5. Linux 中实现确定性调度的机制

(1) 实时调度类(SCHED_FIFO / SCHED_RR)

//优先级 0-99,绝对优先于普通任务(SCHED_NORMAL 优先级视为 100+)
struct sched_param param = { .sched_priority = 50 }; //99-50=49
sched_setscheduler(pid, SCHED_FIFO, &param);

SCHED_FIFO:先进先出,高优先级任务运行到主动让出,不被同优先级抢占;
SCHED_RR:轮转,同优先级任务时间片轮流;
保证:只要有实时任务就绪,普通任务不会运行;

(2) SCHED_DEADLINE(最强的确定性)

基于 EDF(Earliest Deadline First)+ CBS(Constant Bandwidth Server):

struct sched_attr attr = {
    .sched_policy = SCHED_DEADLINE,
    .sched_runtime  = 10 * 1000 * 1000,   // 每周期需要 10ms 运行时间
    .sched_deadline = 30 * 1000 * 1000,   // 必须在 30ms 内完成
    .sched_period   = 100 * 1000 * 1000,  // 每 100ms 一个周期
};
sched_setattr(pid, &attr, 0);

a. 内核保证:每 period 内,任务能获得 runtime 的 CPU 时间,且在 deadline 前完成.
b. 通过准入控制(admission control)拒绝无法满足的任务,保证已接纳任务的确定性.

(3) PREEMPT_RT(实时补丁)

将 Linux 改造为硬实时系统的关键补丁:

PREEMPT_RT 做的事:

  - 将 spinlock 变为可睡眠的 rt_mutex(减少不可抢占区间);
  - 中断线程化(threaded IRQ)→ 中断可被更高优先级任务抢占;
  - 实现优先级继承(priority inheritance)→ 避免优先级反转;
  - 高精度定时器 → 精确的调度时机;
  → 将内核的最大不可抢占延迟从毫秒级降到微秒级; 

 

6. 确定性调度的应用场景

----------------------------------------------------------------------------------
场景            为什么需要确定性
----------------------------------------------------------------------------------
工业控制         PLC 必须在固定周期内响应,否则设备失控
汽车 ECU        刹车、气囊等安全功能有硬时限
音视频           音频缓冲区必须按时填充,否则爆音/卡顿
机器人/无人机     控制回路周期抖动会导致失稳
高频交易         微秒级延迟波动直接影响收益
电信基带         帧处理有严格的时序要求
----------------------------------------------------------------------------------


7. 确定性 vs 高性能的权衡

----------------------------------------------------------------------------------
                确定性调度                    高吞吐调度(CFS)
----------------------------------------------------------------------------------
最坏延迟          ≤ 上界(可保证)               无保证(偶发长延迟)
平均延迟          可能较高                     较低
吞吐量            较低(为保证牺牲)             较高
CPU 利用率        可能不满(预留裕量)            接近满
适用              实时/控制系统                通用/服务器/桌面
----------------------------------------------------------------------------------

确定性是用"平均性能"换"最坏情况保证"


8. 一句话总结

确定性调度 = 保证任务在可预测的时间上界内被调度执行,牺牲部分平均性能和 CPU 利用率,换取最坏情况的时间保证。 Linux 通过 SCHED_FIFO/RR、SCHED_DEADLINE 和 PREEMPT_RT 提供不同程度的确定性。

 

posted on 2026-08-28 15:54  Hello-World3  阅读(16)  评论(0)    收藏  举报

导航