优先级反转及其两种解决方案
- 优先级继承协议
- 优先级天花板协议
优先级反转的描述
高优先级任务被低优先级任务阻塞(高优先级申请的信号量被低优先级占有) 导致高优先级任务得不到调度,而中优先级的任务却能得到执行。
从现象上来理解,好像是中优先级任务比高优先级任务具有更高的优先权。
举例理解:
假设现在有任务1、任务2、任务3;它们的优先级顺序分别为1,2,3。有一个稀缺资源S,S由一个信号量控制为互斥访问。
1. 任务3正在执行,并申请到了稀缺资源S;
2. 就绪队列的任务1优先级大于任务3,所以此时任务1抢占了任务3的执行,任务3挂起,任务1执行;
3. 任务1申请资源S,发现被占用,所以挂起,任务3恢复执行;
4. 任务2抢占了任务3的执行,任务3挂起,任务2执行;
5. 任务2执行完毕,任务3恢复;
6. 任务3释放资源S,任务1抢占资源S,任务1执行,任务3挂起;
7. 任务1执行完毕,任务3执行;
8. 任务3执行完毕。
分析:
由于稀缺资源S的独占性,任务3在申请到资源后,任务1必然要在任务3释放资源后才能执行完成。而任务2肯定会抢占任务3的执行。这个时候,如果任务1要在任务2之前执行,有两种方法:任务3释放资源,或者是任务2不能抢占任务3。
解决办法
优先级继承协议
当一个任务阻塞了一个或多个高优先级任务时,该任务将不使用其原来的优先级,而使用被该任务所阻塞的所有任务的最高优先级作为其执行临界区的优先级。当该任务退出临界区时,又恢复到其最初的优先级。
在优先级继承协议中,高优先级任务仍然可能被低优先级任务所阻塞。
这种阻塞是有意义的:
- 阻塞用来确保临界资源使用的一致性能够得到满足。
- 高优先级任务虽然被阻塞,但是其阻塞时间是确定的。
优先级继承协议的实质:
局部牺牲高优先级任务的实时性,保证整个系统的确定性
优先级继承协议特点:
-
只有在高优先级任务与低优先级任务共享临界资源,且低优先级任务已经进入临界区后,高优先级任务才可能被低优先级任务所阻塞;
-
高优先级任务被低优先级任务阻塞的最长时间可以确定;
-
如果有m个信号量可能阻塞任务T,则任务T最多被阻塞m次。
优势
系统运行前就能够确定任务的最大阻塞时间。
不足
1.协议本身不能避免死锁的发生;
2.任务的阻塞时间虽然是有界的,但由于可能出现阻塞链,使得任务的阻塞时间可能会很长。
优先级天花板:
优先级天花板指控制访问临界资源信号量的优先级天花板。信号量的优先级天花板为所有使用该信号量的任务的最高优先级。
在优先级天花板协议中,如果任务获得信号量,则在任务执行临界区的过程中,任务的优先级将被抬升到所获得信号量的优先级天花板。
执行过程
-
对于控制临界区的信号量,设置信号量的优先级天花板为可能申请该信号量的所有任务中具有最高优先级任务的优先级;
-
如果任务成功获得信号量,任务的优先级将被抬升为信号量的优先级天花板;任务执行完临界区,释放信号量后,其优先级恢复到其最初的优先级;
-
如果任务成功获得信号量,任务的优先级将被抬升为信号量的优先级天花板;任务执行完临界区,释放信号量后,其优先级恢复到其最初的优先级;
关于执行效率的比较
-
优先级继承协议可能多次改变占有某临界资源的任务的优先级
-
优先级天花板协议只需改变一次。
从这个角度看,优先级天花板协议的效率高,因为若干次改变占有资源的任务的优先级会引入更多的额外开销,导致任务执行临界区的时间增加。
对程序运行过程影响程度的比较
-
优先级天花板协议中,一旦任务获得某临界资源,其优先级就被抬升到可能的最高程度,不管此后在它使用该资源的时间内是否真的有高优先级任务申请该资源——有可能影响某些中间优先级任务的完成时间。
-
优先级继承协议中,只有当高优先级任务申请已被低优先级任务占有的临界资源这一事实发生时,才抬升低优先级任务的优先级,因此它对任务执行流程的影响相对要较小。