3、任务调度算法:RMS单调速率调度、EDF最早截止时间优先、优先级反转与优先级继承

各位同学,今天我们来聊聊实时系统里最核心的问题——任务调度。说白了,就是CPU先干谁的活,后干谁的活。这可不是简单的排队问题,搞不好系统会崩的。

我刚开始做嵌入式那会儿,觉得调度嘛,不就是按优先级来?后来在项目中吃了大亏,才明白这里面的门道有多深。今天我把三个核心知识点掰开揉碎了讲给你听。

3.1 单调速率调度(RMS)

RMS,全称Rate Monotonic Scheduling。名字听着唬人,其实道理很简单:周期越短的任务,优先级越高

你想想看,一个任务每1ms跑一次,另一个每100ms跑一次。哪个更紧急?当然是1ms那个。它要是被耽误了,系统可能就乱套了。

核心原则:任务周期T越小,优先级P越高。P = 1/T。

RMS是静态优先级调度。什么意思?任务一创建,优先级就定死了,运行过程中不会变。这有个好处——实现简单,系统开销小。

但RMS有个致命问题:CPU利用率有上限。公式是这样的:

U = n × (2^(1/n) - 1)

当任务数n趋向无穷时,U的上限是ln2 ≈ 69.3%。也就是说,用RMS调度,CPU利用率超过69.3%,就可能出现任务错失截止时间的情况。

任务数n 利用率上限
1 100%
2 82.8%
3 77.9%
69.3%

我的经验:在实际项目中,我一般把CPU利用率控制在60%以内。留点余量,万一有突发任务呢?我曾经在一个无人机飞控项目里,把利用率压到68%,结果一遇到强风,任务就超时了。从那以后,我给自己定了个规矩——RMS下,利用率不超过60%。

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

EDF,Earliest Deadline First。这名字更直白:谁的截止时间最近,谁先执行

EDF是动态优先级调度。任务的优先级会随着时间变化。比如一个任务还有10ms到截止时间,另一个还有50ms,那前者优先级更高。

EDF的好处很明显:CPU利用率理论上可以达到100%。比RMS的69.3%强多了。

但EDF也有坑。我遇到过最头疼的问题——过载时的多米诺效应。一旦系统过载,一个任务超时,可能导致一连串任务都超时。这比RMS的后果严重得多。

注意:EDF在过载时,系统行为不可预测。RMS至少能保证高优先级任务不丢。EDF可能所有任务都完蛋。我建议:除非你对系统负载有绝对把握,否则慎用EDF。

来看个对比:

特性 RMS EDF
优先级类型 静态 动态
CPU利用率上限 69.3%(n→∞) 100%
实现复杂度
过载行为 可预测 不可预测

3.3 优先级反转与优先级继承

好,接下来这个坑,我敢说90%的嵌入式工程师都踩过——优先级反转

什么叫优先级反转?简单说:低优先级任务把高优先级任务给堵住了

场景是这样的:有三个任务,优先级从高到低是T1、T2、T3。T3先运行,拿到了一个共享资源(比如一个互斥锁)。然后T1就绪了,它也想用这个资源,但锁在T3手里,T1只能等。这时候T2就绪了,它不需要这个资源,但它优先级比T3高,所以T2抢占了T3。结果呢?T1在等T3,T3被T2抢占了,T1反而被T2间接阻塞了。

这就是优先级反转。高优先级的T1,被低优先级的T2给拖住了。荒唐吧?但现实中经常发生。

后果:优先级反转可能导致高优先级任务错过截止时间。在实时系统里,这是致命的。

怎么解决?优先级继承协议

优先级继承的核心思想:当低优先级任务持有高优先级任务需要的资源时,低优先级任务临时继承高优先级任务的优先级

还是刚才那个例子。T3持有锁,T1在等锁。这时候T3临时继承T1的优先级。T2就绪了,但发现T3的优先级比它高,T2抢不了T3。T3赶紧跑完,释放锁,然后T1拿到锁执行。T1跑完了,T2再跑。

你看,这样T1就不会被T2堵住了。

我的避坑指南:我曾经在一个工业控制器项目里,因为没做优先级继承,导致一个200ms周期的任务,偶尔被拖到500ms才完成。查了三天才找到原因。从那以后,我所有涉及共享资源的代码,都强制使用支持优先级继承的互斥锁。比如FreeRTOS的互斥量就支持优先级继承,记得用那个,别用二值信号量。

优先级继承的实现要点:

  • 只发生在持有资源的任务被更高优先级任务阻塞时
  • 继承的优先级只持续到资源释放
  • 释放资源后,任务恢复原来的优先级
  • 可能有链式阻塞,需要递归处理

嗯,这里要注意:优先级继承不是万能的。它只能解决直接阻塞的问题。如果系统里有多个资源嵌套使用,情况会更复杂。这时候可能需要考虑优先级天花板协议。

好了,今天的内容就到这里。调度算法是实时系统的灵魂,选对了,系统稳如泰山;选错了,调试到怀疑人生。希望你们在实际项目中,能避开我踩过的那些坑。

任务调度算法知识体系 RMS 单调速率调度 EDF 最早截止时间优先 优先级反转与继承 静态优先级:周期越短优先级越高 CPU利用率上限:69.3% 实现简单,过载行为可预测 动态优先级:截止时间最近优先 CPU利用率可达100% 过载时多米诺效应 低优先级阻塞高优先级 优先级继承:临时提升优先级 释放资源后恢复原优先级 选择建议 确定性要求高 → RMS | 利用率要求高 → EDF | 共享资源 → 优先级继承

专注资料整理