第四章:任务调度策略——优先级抢占、时间片轮转、EDF、RMS调度算法

调度策略,说白了就是决定「下一个该谁跑」的规则。我做了十几年运动控制,见过太多因为调度选错导致系统崩溃的案例。你想想看,一个伺服电机每毫秒要更新一次位置指令,如果调度器把关键任务晾在一边,那后果就是电机抖动、甚至飞车。

这一章,我们聊聊四种经典调度算法。它们各有脾气,选对了是利器,选错了是坑。

4.1 优先级抢占调度(Priority Preemptive Scheduling)

这是实时系统里最常用的策略。每个任务有个优先级,数字越小优先级越高(或者反过来,看具体实现)。高优先级任务就绪时,立刻打断低优先级任务的执行。

我在项目中遇到过这样一个场景:一个六轴机器人控制器,主控周期任务优先级设为最高,通信任务次之,日志记录最低。结果有一次日志任务写SD卡时卡住了,主控任务迟迟得不到CPU,机器人直接停了。嗯,这里要注意——优先级反转。

避坑指南:我曾经在一个数控系统里,因为没处理好优先级反转,导致插补周期抖动超过200微秒。后来加了优先级继承协议才解决。记住:高优先级任务等低优先级任务释放资源,这是实时系统的头号杀手。

优先级抢占的优点是响应快,确定性高。缺点是低优先级任务可能永远得不到执行——这叫「饥饿」现象。

4.2 时间片轮转调度(Round Robin)

每个任务分到一个固定时间片,轮流执行。时间片到了就强制切换。这玩意儿在实时系统里用得不多,但在非实时任务里很常见。

我个人的习惯是:把非关键的监控任务、界面刷新任务放在时间片轮转里。比如一个运动控制卡,上位机通信任务用时间片轮转,下位机插补任务用优先级抢占。这样既保证了实时性,又不会让界面卡死。

时间片选多大?太短了切换开销大,太长了响应变慢。我一般选1-5毫秒,具体看CPU性能和任务数量。

小技巧:如果你用FreeRTOS或uC/OS,可以把同优先级的任务设为时间片轮转。这样既保留了优先级抢占的实时性,又避免了低优先级任务饿死。

4.3 最早截止时间优先(EDF)

EDF是个理想化的调度算法。它按任务的截止时间排序,截止时间越近的优先级越高。理论上,EDF能实现100%的CPU利用率,只要总利用率不超过1。

但现实很骨感。我在一个视觉引导的焊接机器人项目里试过EDF,结果发现:

  • 任务超载时,EDF会「多米诺骨牌式」地错过所有截止时间
  • 实现复杂度高,需要动态维护一个优先级队列
  • 对时钟精度要求高,稍有偏差就乱套

说白了,EDF更适合理论分析,实际工程中很少直接用。我见过一些高端运动控制器用EDF的变种,但那是经过大量调优的。

调度算法 CPU利用率上限 实现复杂度 适用场景
优先级抢占 取决于任务集 大多数实时系统
时间片轮转 100%(非实时) 非关键任务
EDF 100%(理论) 理论研究、特殊场景
RMS 约69% 周期任务

4.4 速率单调调度(RMS)

RMS是实时系统里最经典的固定优先级调度算法。它的规则很简单:周期越短的任务,优先级越高。为什么?因为周期短的任务通常更紧急,你想想看,一个1ms周期的任务和一个10ms周期的任务,哪个更需要及时响应?

RMS有个著名的可调度性判定条件:

U = Σ (Ci / Ti) ≤ n * (2^(1/n) - 1)

其中:
U = CPU利用率
Ci = 任务i的最坏执行时间
Ti = 任务i的周期
n = 任务数量

当n→∞时,这个上限趋近于ln2 ≈ 0.693。也就是说,用RMS调度,CPU利用率超过69.3%时,就可能出现任务错过截止时间的情况。

我在一个多轴同步控制项目里用过RMS。三个任务:位置环(1ms)、速度环(0.5ms)、电流环(0.1ms)。按RMS,电流环优先级最高,速度环次之,位置环最低。实际跑下来,CPU利用率约65%,一切正常。

经验之谈:RMS虽然利用率上限只有69%,但它的确定性非常好。我建议在运动控制系统中,把关键周期任务用RMS调度,非周期任务用优先级抢占。这样既保证了确定性,又兼顾了灵活性。

4.5 四种调度算法的对比与选择

说了这么多,到底怎么选?我个人的经验是:

  • 运动控制主循环:用RMS或优先级抢占。周期任务多就用RMS,非周期任务多就用优先级抢占。
  • 通信任务:用优先级抢占。把关键报文(比如急停信号)设为最高优先级。
  • 日志、监控、界面:用时间片轮转。这些任务不要求实时性,别让它们干扰主循环。
  • EDF:除非你有很强的理论背景和调试手段,否则别碰。

最后说一句:调度算法没有银弹。我见过用RMS跑得稳稳的系统,也见过用优先级抢占崩得一塌糊涂的项目。关键是要理解你的任务特性,然后选一个合适的算法,再配合足够的测试和调优。

任务调度策略知识体系 任务调度策略 优先级抢占 响应快,确定性高 注意优先级反转 时间片轮转 公平分配CPU 适合非实时任务 最早截止时间优先 理论利用率100% 实现复杂,慎用 速率单调调度 周期越短优先级越高 利用率上限约69% 选择建议:运动控制主循环用RMS,通信用优先级抢占,日志用时间片轮转
核心要点:
  • 优先级抢占:最常用,但要注意优先级反转
  • 时间片轮转:公平但实时性差,适合非关键任务
  • EDF:理论完美,实际难用
  • RMS:周期任务的最佳选择,利用率上限69%

好了,调度策略就聊到这儿。每种算法都有它的脾气,选对了事半功倍,选错了...嗯,你懂的。下一章我们聊聊中断管理,那是实时系统的另一个关键环节。

专注资料整理