Silberschatz/Galvin (第9版)的“操作系统原理”一书以及维基百科关于优先级倒置的文章都指出,在优先级反转中,高优先级进程不能使用低优先级进程所持有的资源,因为中等优先级进程抢占了低优先级进程并获得了该资源。但如果是这样(即,如果允许基于优先级的抢占),为什么高优先级进程不能抢占低优先级进程本身并获得资源呢?
以下是本书和维基百科文章中提到的内容:
考虑两个任务H和L分别具有高优先级和低优先级,它们都可以获得共享资源R的独占使用。如果H试图在L获得R之后获得R,则H会被阻塞,直到L放弃该资源。在设计良好的系统中共享独占资源(在这种情况下是R)通常需要L迅速放弃R,这样H(更高优先级的任务)就不会在过长的时间内被阻塞。然而,尽管有良好的设计,第三个中等优先级的任务M (p(L) < p(M) < p(H),其中p(x)表示任务(X)的优先级)在L使用R时可能会运行,此时M的优先级高于L,抢占L,导致L不能迅速放弃R,进而导致H--最高优先级进程--无法运行。这被称为优先级反转,即优先级较高的任务被优先级较低的任务抢占。
发布于 2016-10-08 23:04:20
这里有一个更好的例子,可以帮助你理解。最后我会解释并回答你的问题。
让我们有三个不同优先顺序的过程。低,医学和高。(低、地中海和高优先级)。
让低进程和高进程在不同的时间访问相同的关键资源。
优先级最低的进程正在运行,Med和High被阻塞并退出其关键部分。
Low进入关键部分并获取High所需的资源。
因为它是系统中最高优先级的任务,所以它运行。
High然后尝试进入关键资源,但是在其中阻塞为Low。
因为它现在是系统中最高优先级的任务,所以它运行。
在Low放弃资源之前,Low无法运行。低不能运行,直到Med块或结束。任务的优先级已经倒置;虽然它具有最高的优先级,但它位于执行链的底部。
为了“解决”优先级倒置,必须将低优先级提高到至少高到高的水平。
底线:Med导致高等待。关键部分由同步工具保护,在低优先级进程自愿放弃之前,高优先级进程不会抢占共享资源。
但是,低优先级进程需要一个资源,该资源目前正在由Med进程使用。=>高优先级进程必须等待。
读这个:What is priority inversion?
归功于在其中一个评论中写了这个例子的人。
https://stackoverflow.com/questions/39933805
复制相似问题