首先解释下什么是优先级反转,举个例子说明
优先级:任务1〉任务2〉任务3
任务1与任务2处于挂起状态,等待某一事件的发生,任务3正在运行,任务3要使用共享资源,在使用共享资源之前,必须得到一个信号量。任务3得到该信号量,开始占有该共享资源,由于任务1的优先级比任务3的要高,任务1等待的事件到来是要剥夺任务3的CPU使用权,任务1开始运行,任务1运行过程中需要使用任务3使用中的共享资源,由于该信号量被任务3占有着,所以任务1挂起,任务3得以继续运行,这个时候任务2等到的事件发生,由于任务2的优先级比任务3的优先级要高,所以这个时候任务2要剥夺任务3的cpu使用权,任务2运行,任务3再次挂起,知道处理完任务2,再把CPU使用权归还给任务3,任务3运行,直到把该共享资源的信号量释放出来,任务3挂起,任务1得以运行,任务1运行完才再次把cpu使用权归还给任务3.
在这个过程中,实际上任务1的优先级降到了任务3的水平,比任务2的优先级低了,这个就叫做优先级反转。
后果:这样会严重的增加任务1的延迟时间
解决的方法:在任务1运行时需要被任务3占有的共享资源的信号量,把任务3的优先级提升至任务1的优先级水平,等到任务3释放出该共享资源的信号量时任务3的优先级水平恢复到初始的水平,这样,任务1完成后,介于任务1到任务3之间的任务可以得以处理。
文章评论(0条评论)
登录后参与讨论