3

我想知道为什么抢占不能解决优先级反转问题
如果我们有抢占式内核。那么为什么优先级反转问题没有得到解决呢?

4

6 回答 6

8

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

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

于 2012-07-05T07:17:57.633 回答
5

让 3 个线程ABC具有各自的优先级HighMediumLow

C获取处理器并获取锁L。然后B被一些事件唤醒并抢占C。现在A被唤醒并通过抢占B来获取处理器。A想要锁L,但失败了,因为L已经由C拥有。A由于锁不可用而被抢占,并将处理器归还给B。我们必须等待B完成,最终将处理器归还给CC将完成并释放锁,最终将唤醒一个

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

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

于 2012-07-05T07:30:35.183 回答
1

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

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

现在,如果资源可以被带走(一种不同的“抢占”),那么这确实可以解决优先级倒置。但这通常是不可能的,因为低优先级任务的半成品动作会导致不一致。

于 2012-07-05T12:32:15.130 回答
0

假设您有 3 个进程:

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

并且AC都使用必须同步的同一个文件(这可以是任何共享资源)。

现在假设AB都没有准备好运行,并且C运行并获得了使用文件的锁。当C持有文件的锁时,A准备运行,操作系统抢占C并运行AA执行到它也需要该文件,当它试图获得锁时,它被阻塞,因为C持有锁。如果同时B准备好运行,它将代替A执行,因为A还没有准备好运行。为了使A准备好,文件锁必须由CC不会运行并释放锁,因为更高优先级的进程B正在运行。因此A正在等待C ,而 C又在等待B。在这种情况下仅仅抢占B是没有用的,因为A还没有准备好,除非C运行,否则C不能运行,因为刚刚抢占的更高优先级B已经准备好运行。

于 2012-07-05T07:18:19.380 回答
0

来自维基

考虑,

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) 的任务之前运行。

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

于 2012-07-05T08:53:34.363 回答
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 将运行。因此,在上述场景中,

于 2012-07-05T16:47:29.073 回答