4. 实时调度理论
实时系统的核心问题不是“谁先运行”,而是“谁必须在截止时间前完成”。在单核实时调度中,常见的策略包括速率单调调度(RM)、最早截止时间优先(EDF)、固定优先级调度、时间片轮转(RR)等。它们对任务模型、优先级分配和可调度性判断的要求各不相同。理解这些差异,是进行系统调优和避免“优先级反转”“CPU 饥饿”等问题的前提。
一、核心原理:任务模型与调度目标
实时任务通常用三个参数描述:执行时间 C、周期 T、相对截止时间 D。若 D = T,称为隐式截止时间任务;若 D < T,称为约束截止时间任务。调度器的目标是在所有任务同时释放的最坏情况下,仍能保证每个任务在截止时间前完成。
- RM(Rate Monotonic):周期越短,优先级越高。属于固定优先级、静态调度,适合周期性任务。
- EDF(Earliest Deadline First):截止时间越早,优先级越高。属于动态优先级调度,理论上利用率上限可达 100%。
- 固定优先级调度:优先级在运行前确定,RM 是其典型代表,实现简单,但利用率上限较低。
- 时间片轮转(RR):同优先级任务轮流执行,适合软实时或非实时任务,但无法保证硬截止时间。
关键结论:RM 的可调度性判据是充分条件,不是必要条件;EDF 在单核且任务可抢占时,利用率不超过 100% 即可调度。但实际系统中,中断、锁、缓存和优先级反转会显著降低理论边界。
二、可调度性分析方法
对于 RM,常用利用率判据:若 n 个任务的 CPU 利用率满足
U = Σ(Ci / Ti) ≤ n × (2^(1/n) - 1)
则系统一定可调度。当 n 趋于无穷时,该上限约为 0.693。也就是说,RM 在最坏情况下只能保证约 69.3% 的 CPU 利用率。若实际利用率高于该值,并不代表一定不可调度,需要用响应时间分析(RTA)进一步判断。
响应时间分析的核心是计算最坏响应时间 Ri:
Ri = Ci + Σ(ceil(Ri / Tj) × Cj) (j 为优先级高于 i 的任务)
若对所有任务都有 Ri ≤ Di,则系统可调度。EDF 的判据更简单:若 Σ(Ci / Ti) ≤ 1,且 D = T,则可调度。但在 D < T 时,需要采用密度判据或处理器需求分析。
三、调度策略对比与适用场景
| 调度策略 | 优先级类型 | 利用率上限 | 典型场景 | 主要风险 |
|---|---|---|---|---|
| RM | 静态固定 | 约 69.3%(n→∞) | 周期任务、嵌入式控制 | 高利用率下误判不可调度 |
| EDF | 动态 | 100%(单核可抢占) | 软实时、多媒体、动态负载 | 过载时连锁错过截止时间 |
| 固定优先级 | 静态 | 取决于分配 | 中断处理、内核线程 | 优先级反转、饥饿 |
| 时间片轮转 | 同优先级轮转 | 无硬保证 | 分时系统、软实时 | 响应抖动大 |
下图展示了 RM 与 EDF 在任务释放和截止时间约束下的调度差异。RM 中周期短的任务始终优先;EDF 中截止时间近的任务动态抢占。
四、常见误区与调优复盘
误区 1:利用率低于 69.3% 就一定没问题。该判据只针对 RM 且任务相互独立、可抢占、无阻塞。实际系统中存在中断延迟、自旋锁、缓存抖动,必须留出余量。
误区 2:EDF 一定优于 RM。EDF 在过载时可能引发“多米诺效应”,多个任务同时错过截止时间;RM 在过载时高优先级任务仍能保证,行为更可预测。
误区 3:时间片轮转可以用于硬实时。RR 不区分截止时间,只保证公平,响应抖动大,通常只用于软实时或后台任务。
在 Linux 实时调优中,常用 chrt 查看和设置调度策略:
chrt -f 80 ./control_task # SCHED_FIFO,优先级 80
chrt -r 50 ./logger # SCHED_RR,优先级 50
chrt -o 0 ./background # SCHED_OTHER,普通分时
chrt -p $$ # 查看当前 shell 的调度策略
调优时建议先测量最坏响应时间,再用 RTA 验证;若 RM 判据不通过,可尝试缩短关键任务周期、降低非关键任务优先级,或改用 EDF 并配合过载保护。最终目标不是追求理论利用率,而是在真实负载下保证截止时间。