什么是优先倒置?

时间:2010-11-23 02:21:06

标签: operating-system priority-inversion

我听说过关于操作系统开发的“优先级倒置”这个短语。

优先级倒置究竟是什么?

它要解决的问题是什么,它是如何解决的?

11 个答案:

答案 0 :(得分:65)

想象一下三(3)个不同优先级的任务:tLow,tMed和tHigh。 tLow和tHigh在不同时间访问相同的关键资源; tMed做了自己的事。

  1. t正在运行,tMed和tHigh目前被阻止(但不在关键部分)。
  2. t出现并进入关键部分。
  3. t高解除阻塞,因为它是系统中最高优先级的任务,所以它会运行。
  4. tHigh然后尝试输入关键资源,但阻止为tLow在那里。
  5. tMed取消阻止,因为它现在是系统中最高优先级的任务,所以它会运行。
  6. tLigh在tLow放弃资源之前无法运行。 t在tMed阻塞或结束之前不能运行。任务的优先级已被颠倒;虽然它具有最高优先级,但它位于执行链的底部。

    要“解决”优先级倒置,必须将tLow的优先级提高到至少与tHigh一样高。有些人可能会优先考虑最高优先级。与提高tLow的优先级一样重要的是在适当的时间降低tLow的优先级。不同的系统将采用不同的方法。

    何时放弃tLow的优先级...

    1. 没有任何其他任务在tLow拥有的任何资源上被阻止。这可能是由于超时或资源释放造成的。
    2. 没有任何其他有助于提高tLow优先级的任务会被tLow所拥有的资源阻止。这可能是由于超时或资源释放造成的。
    3. 当任务等待资源发生变化时,请删除tLow的优先级以匹配在其资源上阻止的最高优先级任务的优先级。
    4. 方法#2是对方法#1的改进,因为它缩短了tLow优先级被提升的时间长度。请注意,在此期间,其优先级仍然高于tHigh的优先级。

      方法#3允许tLow的优先级在必要时以增量递减,而不是在一个全有或全无步骤中降低。

      不同的系统会根据他们认为重要的因素实施不同的方法。

      • 内存足迹
      • 复杂性
      • 实时响应
      • 开发者知识

      希望这有帮助。

答案 1 :(得分:53)

优先级倒置是一个问题,而不是解决方案。典型示例是低优先级进程获取高优先级进程所需的资源,然后被中优先级进程抢占,因此高优先级进程在资源上被阻止,而中优先级进程完成(有效地执行优先级较低)。

一个相当着名的例子是火星探路者漫游者遇到的问题:http://www.cs.duke.edu/~carla/mars.html,这是一个非常有趣的读物。

答案 2 :(得分:18)

the problem而不是解决方案。

它描述了这样的情况:当低优先级线程在工作期间获得锁定时,高优先级线程将不得不等待它们完成(这可能需要特别长的时间,因为它们是低优先级的)。这里的反转是高优先级线程在低优先级线程执行之前无法继续,因此实际上它现在也具有低优先级。

一个常见的解决方案是让低优先级线程暂时继承等待锁定的每个人的高优先级。

答案 3 :(得分:15)

假设一个应用程序有三个线程:

Thread 1 has high priority.
Thread 2 has medium priority.
Thread 3 has low priority.

我们假设线程1和线程3共享相同的关键部分代码

线程1和线程2在示例的开头处处于休眠或阻塞状态。线程3运行并进入关键部分。

此时,线程2开始运行,抢占线程3,因为线程2具有更高的优先级。因此,线程3继续拥有一个关键部分。

稍后,线程1开始运行,抢占线程2.线程1尝试进入线程3拥有的关键部分,但由于它由另一个线程拥有,因此线程1阻塞,等待临界区。

此时,线程2开始运行,因为它具有比线程3更高的优先级并且线程1没有运行。线程3永远不会释放线程1正在等待的关键部分,因为线程2继续运行。

因此,系统中的最高优先级线程(线程1)将被阻塞,等待优先级较低的线程运行。

答案 4 :(得分:3)

[假设,低过程= LP,中过程= MP,高过程= HP]

LP正在执行关键部分。在进入关键部分时,LP必须已经锁定了一些物体,比如OBJ。 LP现在位于关键部分。

与此同时,HP也已创建。由于优先级较高,CPU会执行上下文切换,而HP现在正在执行(不是相同的关键部分,而是其他一些代码)。在惠普执行期间的某个时刻,它需要锁定同一个OBJ(可能也可能不在同一个关键部分),但OBJ上的锁仍然由LP保持,因为它被抢占了执行关键部分。 LP现在无法放弃,因为进程处于READY状态,而不是RUNNING。现在HP已转为BLOCKED / WAITING状态。

现在,MP进来了,并执行自己的代码。 MP不需要锁定OBJ,因此它会保持正常执行。 HP等待LP释放锁定,LP等待MP完成执行,以便LP可以返回RUNNING状态(..并执行并释放锁定)。只有在LP释放锁定后,HP才能回到READY状态(然后通过预先执行低优先级任务进入RUNNING。)

所以,实际上它意味着在MP完成之前,LP无法执行,因此HP无法执行。因此,似乎HP正在等待MP,即使它们没有通过任何OBJ锁直接相关。 - > 优先级倒置

优先级倒置的解决方案是Priority Inheritance -

  

将进程(A)的优先级提高到任何优先级   等待A有资源锁定的任何资源的其他进程。

答案 5 :(得分:2)

让我说得非常简单明了。 (这个答案基于上面的答案,但以清晰的方式呈现)。

假设有一个资源R和3个进程。 LMH。其中p(L) < p(M) < p(H)(其中p(X)的优先级为X)。

  • L首先开始执行并抓住R。 (独家访问R
  • H稍后出现,并希望对R拥有独占访问权限,自L持有H后,M必须等待。
  • H来自R它不需要M 。由于L已获得要执行的所有内容,因此强制L离开,因为它与H相比具有高优先级。但L无法执行此操作,因为它有一个由M锁定的资源,需要执行。

现在让问题更加明确,实际上H应该等待p(H) > p(M)完成M,而L并没有发生,这本身就是问题所在。如果H等许多流程出现并且不允许if else执行并释放锁sum()将永远不会执行。这在时间关键应用中可能是危险的

对于解决方案,请参考以上答案:)

答案 6 :(得分:1)

优先级倒置是指优先级较低的进程获得优先级较高的进程所需的资源,阻止优先级较高的进程继续进行,直到资源被释放为止。

例如: File1需要由Proc1和Proc2访问。 Proc 1的优先级高于Proc2,但Proc2设法首先打开FileA。

通常,Proc1的运行速度可能是Proc2的10倍,但由于Proc2持有该文件,因此无法执行任何操作。

所以最终发生的事情是Proc1阻塞直到Proc2完成FileA,基本上它们的优先级是“反转的”,而Proc2保存FileA的句柄。

就“解决问题”而言,优先级倒置本身就是一个问题,如果它继续发生的话。 最坏的情况(大多数操作系统不会让这种情况发生)是因为在Proc1之前不允许Proc2运行。这将导致系统锁定,因为Proc1将继续获得分配的CPU时间,并且Proc2永远不会获得CPU时间,因此该文件永远不会被释放。

答案 7 :(得分:1)

优先级倒置发生如下: 给定流程H,M和L,其中名称代表高,中,低优先级, 只有H和L共享一个共同的资源。

说,L首先获取资源并开始运行。由于H也需要该资源,因此它进入等待队列。 M不共享资源并且可以开始运行,因此确实如此。当L以任何方式中断时,M采用运行状态,因为它具有更高的优先级,并且在中断发生的瞬间运行。 虽然H具有比M更高的优先级,但由于它在等待队列上,因此它无法获取资源,这意味着优先级低于甚至M. M完成后,L将再次接管CPU,导致H等待整个时间。

答案 8 :(得分:0)

Priority Inversion can be avoided if the blocked high priority thread transfers its high priority to the low priority thread that is holding onto the resource.

答案 9 :(得分:0)

当优先级较高的进程需要读取或修改当前由较低优先级进程或较低优先级进程链访问的内核数据时,就会出现调度挑战。由于内核数据通常使用锁保护,因此优先级较高的进程必须等待优先级较低的进程才能使用该资源进行保护。如果优先级较低的进程被抢占而有利于具有更高优先级的另一个进程,则情况会变得更加复杂。作为一个例子,假设我们有三个进程-L,M和H-其优先级遵循L&lt; M&lt; H.假设进程H需要资源R,当前正由进程L访问。通常,进程H将等待L使用资源R完成。但是,现在假设进程M变为可运行,从而抢占进程L.间接地,具有较低优先级的进程M-已影响进程H必须等待L放弃资源R的时间长度。此问题称为优先级倒置。它仅发生在具有两个以上优先级的系统中,因此一种解决方案是但是,对于大多数通用操作系统而言,这只是两个优先事项。通常,这些系统通过实现优先级继承协议来解决问题。根据该协议,正在访问优先级较高的进程所需资源的所有进程都会继续获得更高的优先级,直到它们完成所讨论的资源。当它们完成后,它们的优先级将恢复为原始值。在上面的示例中,优先级继承协议将允许进程L临时继承进程H的优先级,从而防止进程M抢占其执行。当进程L使用资源R完成时,它将从H放弃其继承的优先级并假设其原始优先级。因为资源R现在可用,所以进程H-而不是M-将继续运行。 参考:ABRAHAM SILBERSCHATZ

答案 10 :(得分:0)

考虑一个具有两个进程的系统,H具有高优先级,L具有低优先级。调度规则是这样的:H因其高优先级而处于就绪状态时运行。在某个时刻,L处于关键区域,H准备好运行(例如,I / O操作完成)。 H现在开始忙着等待,但由于在L正在运行时从未安排HL永远不会有机会离开关键部分。所以H永远循环。

这种情况称为Priority Inversion。因为优先级较高的进程正在等待优先级较低的进程。