为什么抢占不解决优先级倒置?

Ras*_*yak 3 c embedded microcontroller rtos

我想知道为什么抢占不解决优先级倒置问题
如果我们有抢先内核.那么为什么优先级倒置问题无法解决?

ayd*_*man 8

好吧,假设我们有两个流程.我们还假设具有较低优先级的进程获得锁定.当优先级较高的进程准备就绪时,它会抢占其他进程.如果优先级较高的进程需要该锁定,则由于具有较低优先级的其他进程而无法获取该锁定.这意味着,优先级较低的进程会阻止优先级较高的进程.它可以防止更高优先级的进程运行.这称为"优先级倒置".

显然,抢占不是优先级倒置的解决方案.解决方案是"优先级继承".这意味着我们应该在获取优先级较高的进程所需的锁时临时增加进程的优先级.它应该是可能需要相同锁定的其他进程中的最高优先级进程.


Ben*_*oit 5

让3个线程ABC分别具有优先级。

Ç获取所述处理器,并采取锁定大号。然后是由一些事件和阻击唤醒Ç。现在,A被唤醒并抢占B获得处理器。A想要锁L,但是失败,因为L已经由C拥有。一个被抢占,因为锁不可用,并还给处理器。我们不得不等待来完成,这终将回馈处理器最终ÇC将完成并释放锁,最后将其唤醒

这是优先级倒置,因为B运行,而系统中的线程A具有较高的优先级,等待较低优先级的线程(在本例中为C)的完成。

顺便说一句,解决方案是优先级继承

  • 我的一位同事曾经有一个有趣的想法,即调度程序可以保留当前阻塞在其他线程拥有的同步对象上的线程之间的依赖关系的DAG(嗯,您希望它是非循环的)。然后,每当您要计划A但它被阻止时,您都可以按照DAG到叶节点(在本例中为C),然后运行它而不是A。他从未实现过,而且还存在很多复杂的问题。没有详细的设计就无法解决。特别是它有可能比简单的优先级继承更“公平”。与WaitForMultipleObjects。 (2认同)