RTOS 中的优先级反转与解决策略
概述
上节讲述了可以使用二值信号量实现任务-任务之间的共享资源的保护。二值信号量的确完成了保护共享资源的任务,但在一些情况下,这种策略会带来副作用-即优先级反转。
优先级反转是如何产生的
理想情况下,按照我们的设计,优先级高的任务总是应该被优先地运行,也包括优先地获取各种资源。但很遗憾,优先级主要影响获取 CPU 这种关键资源的优先顺序,对于其他共享资源,优先级其实并不能按照我们想的那样,让优先级高的任务优先获得共享资源。
请考虑下述三个任务的一个运行过程:
1) 优先级为1的任务1先运行(即此时在占用CPU),其想获得“LED灯”这个资源,因此通过信号量发起了申请,得到了LED灯这个资源(*此时二值信号量的“当前消息数量”由1减为0*)。
2)优先级为2的任务2在某个时刻进入就绪态,因为其优先级比1高,因此抢占了任务1的CPU资源,进入运行态,同时任务1将暂存在就绪列表等待获取CPU资源再次执行。
3)优先级为3的任务3在某个时刻进入就绪态了,因为其优先级比2高,因此抢占了任务2的CPU资源,进入运行态,同时任务2将暂存在就绪列表等待获取CPU资源再次执行。
4)在任务3执行过程中,其也想获得“LED灯”这个资源,因此它也向管理LED灯资源的信号量发起获取请求,但很遗憾,此时二值信号量中的“****当前消息数量”为0,****因此任务3不得不因为申请失败