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

时间:2012-07-05 06:53:58

标签: c embedded microcontroller rtos

我想知道为什么 preemption 无法解决优先级反转问题
如果我们有抢先内核。那么为什么优先级反转问题无法解决?

6 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

让3个主题 A B C 各自的优先级

C 获取处理器并锁定 L 。然后 B 被某些事件唤醒并抢占 C 。现在 A 被唤醒并通过抢占 B 来获得处理器。 A 希望锁定 L ,但失败,因为 L 已归 C 所有。 A 因锁定不可用而被抢占,并将处理器返回 B 。我们必须等待 B 完成,这最终会导致处理器返回 C C 将完成并释放锁定,最终会唤醒 A

这是优先级反转,因为 B 运行,而我们在系统中有一个线程 A ,具有更高优先级等待完成优先级较低的线程(在这种情况下为 C )。

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

答案 2 :(得分:1)

抢占意味着拿走处理器,以便任务不再运行。

这还不够,因为低优先级任务拥有高优先级任务所需的资源。

现在如果资源可以被拿走(另一种“先发制人”),那么这确实可以解决优先级倒置问题。但这通常是不可能的,因为低优先级任务的半完成动作会导致不一致。

答案 3 :(得分:0)

假设您有3个进程:

  • A - 高优先级
  • B - 正常优先级
  • C - 低优先级

并且 A C 都使用相同的文件(可能是任何共享资源),其使用必须同步。

现在假设 A B 都准备好运行, C 运行并获取锁定以使用该文件。当 C 锁定文件时, A 准备好运行,操作系统抢占 C ,然后运行 A 即可。 A 执行到它还需要该文件的点,当它尝试获取锁时,它被阻止,因为 C 持有锁。如果平均时间 B 准备好运行,则会执行而不是 A ,因为 A 尚未准备好运行。要准备 A ,必须通过 C 释放文件锁定,并且 C 将无法运行并释放锁定,因为更高优先流程 B 正在运行。因此 A 正在等待 C ,而 C 正在等待 B 。在这种情况下抢占 B 会没有好处,因为 A 还没有准备好,除非 C 运行,否则不会> C 无法运行,因为刚刚抢占的优先级较高的 B 已准备就绪。

答案 4 :(得分:0)

来自Wiki

考虑,

L - >低优先级任务
H - >高优先级任务
M - >中等优先任务
R - >资源

步骤1:L获得R
步骤2:H请求R(当前与L一起使用,所以H将等待L放弃R.) 步骤3:M到达(M是非阻塞任务。即它不需要R)
步骤4:L被M抢占(因此L不能放弃R.因此,H无法运行。)

在M完成它的执行后,L将放弃R.然后只有H可以继续。 在上面的场景中,具有中优先级(M)的任务在具有高优先级(H)的任务之前运行。

这是抢占式内核中的实际优先级倒置场景。

答案 5 :(得分:0)

优先级倒置是一种有问题的情况,当优先级较高的任务被较低优先级的任务有效地“抢占”两个任务的相对优先级时,优先级倒是任务。

考虑有一个任务L,优先级低。此任务需要资源R.考虑L正在运行并且它获取资源R.现在,还有另一个具有高优先级的任务H.此任务还需要资源R.考虑H在L获得资源R之后开始。现在H必须等到L放弃资源R. 到目前为止,一切都按预期工作,但是在此期间新任务M(不使用R)以中等优先级启动时会出现问题。由于R仍然在使用(由L),H无法运行。由于M是优先级最高的未阻塞任务,因此它将被安排在L之前。由于L已经被M抢占,L不能放弃R.所以M将一直运行直到它完成,然后L将运行 - 至少到达一个点它可以放弃R - 然后H会运行。因此,在上面的场景中,具有中等优先级的任务在具有高优先级的任务之前运行,从而有效地为我们提供优先级倒置。