前面提到了二值信号量的概念,但是在多个不同优先级的任务想要同时Take和Give二值信号量时,往往会因为被占用的问题,使得高优先级任务的执行顺序与低优先级任务一样。这种情况被称为优先级翻转,优先级翻转在可剥夺内核中是非常常见的,在实时系统中不允许出现这种现象,这样会破坏任务的预期顺序,可能会导致严重的后果。
(1) 任务H和任务M处于挂起状态,等待某一事件的发生,任务 L正在运行。
(2) 某一时刻任务 L想要访问共享资源,在此之前它必须先获得对应该资源的信号量。
(3) 任务 L获得信号量并开始使用该共享资源。
(4) 由于任务H优先级高,它等待的事件发生后便剥夺了任务 L的CPU使用权。
(5) 任务H开始运行。
(6) 任务H运行过程中也要使用任务 L正在使用着的资源,由于该资源的信号量还被任务L占用着,任务H只能进入挂起状态,等待任务 L释放该信号量。
(7) 任务 L继续运行。
(8) 由于任务M的优先级高于任务 L,当任务M等待的事件发生后,任务M剥夺了任务L的CPU 使用权。
(9) 任务M处理该处理的事。
(10) 任务M执行完毕后,将 CPU使用权归还给任务L。
(11) 任务 L继续运行。
(12) 最终任务 L完成所有的工作并释放了信号量,到此为止,由于实时内核知道有个高优先级的任务在等待这个信号量,故内核做任务切换。
(13) 任务H得到该信号量并接着运行。
在这种情况下,任务H的优先级实际上降到了任务L的优先级水平。因为任务H要一直等待直到任务 L释放其占用的那个共享资源。由于任务M剥夺了任务 L的CPU 使用权,使得任务H的情况更加恶化,这样就相当于任务M的优先级高于任务H,导致优先级翻转。
原文链接:https://blog.csdn.net/qq_39397153/article/details/125040287
标签:信号量,优先级,问题,任务,等待,CPU,翻转 From: https://www.cnblogs.com/xddisme/p/18341927