(多年前的真实经历)
面试官:懂不懂RTOS?
小白:懂一点。
面试官:你来讲一下什么是优先级翻转,什么是优先级继承。
小白:……
曾经一度以为是因为自己没答上来,而失去了一份心仪已久的offer,但实际上哪怕答上来我也可能只是个joke.
优先级的翻转与继承发生在什么情况下?
1. 首先这里所说的都是任务级的优先级(中断也是有优先级的,那归NVIC管,RTOS插不上手)
2. 必须是多任务运行情况下(至少三个以上的任务)。
3.不同优先级任务之间存在同步的关系(尤其是高优先级任务与低优先级任务之间有爱恨纠葛)。
接下来看一看优先级继承与翻转出现的情况。
优先级翻转的运行顺序:
时刻一: Task3正在运行态,并且正在访问某个共享资源。
时刻二: 这个时候Task1 变为就绪态,于是抢占Task3任务,抢占发生后,Task1变为运行态,Task3变为就绪态。
时刻三: 假如在这一时刻,Task2从阻塞态变为了就绪态,但是由于Task1在运行态,所以他只能等待。
时刻四:Task1在运行过程中,需要访问某个共享资源,但资源被Task3占用,于是Task1进入阻塞态。
猎杀时刻到来:Task1进入阻塞态,调度器需要从就绪任务列表中,读取当前已经就绪的任务,选择优先级较高的任务,让其进入运行态。目前在就绪任务列表中的任务有个Task2和Task3,该谁进入运行态呢?
情况一(当任务间应用二值信号量进行资源获取时发生):
Task2进入运行态的情况,由于Task2 < Task1 ,所以站在应用的角度来看优先级发生了翻转。
情况二(当任务间应用互斥信号量进行资源获取时发生):
Task3进入运行态的情况,由于Task3 < Task2,所以站在应用的角度来看,Task3先于Task2运行,更像是Task3继承了Task1的优先级,而发生了优先级抢占。
总结一下:
不论是优先级继承还是优先级翻转,都不是错误,对于调度器来讲都只能算是常规操作,他只是根据同步的类型以及任务的优先级,进行了确定性的判断,并调整任务的状态而已。
应用看起来有点怪或者是异常都是由设计者导致的,你比如常规的操作造成死锁,挂掉整个应用,你也不能怪调度器不是。
题外话:
其实一切都没那么复杂,在你真正实践的时候就能掌握所有细节。