0

我已经阅读了很多关于优先级反转的帖子,但我仍然无法澄清我对某些部分的理解。如果有人能对我的问题有所了解,我会很高兴。

我们先描述一下情况。我有一个伪代码,这是不言自明的。

我有一个共享资源 - int t; 这是将由三个线程执行的函数 - 低优先级任务 p1、中优先级任务 p2、高优先级任务 p3。

/**Shared resource **/
int t;

/** Function that will be executed by three threads **/

void func()
{
   printf("hello..world");    /** line number 11**/
   mutex_lock(&lock);         /** line number 12**/
   {                          /** line number 13**/
      for(int i = 0; i<=100; i++) /** line number 14**/
      {                          /** line number 15**/
         t++;                   /** line number 16**/
      }                         /** line number 17**/

   }                            /** line number 18**/

   mutex_unlock(&lock);        /** line number 19**/

}                              /** line number 20**/

假设 p1(low p).. 开始执行 func()。现在让我们说它在第 13 行。在互斥锁之后。意味着同时让我们说 p3 ..开始运行。现在,p3 将被阻塞,因为 p1 在临界区。因此,p3 进入阻塞状态。

场景 - p1 - 在临界区内部 - 处于运行状态。p3 - 阻塞状态。

现在,假设 p2 开始运行。由于 p2 处于运行状态,由于 p2 处于临界区,它也会被 p1 阻塞。那么这里怎么会发生优先级反转呢?之后我失去了理解,请解释我..

我下面的理解是否正确?如果不是,请更正。p2任务发生优先级反转时应该是什么情况?我知道当 p2 开始运行时会发生优先级反转。p2 完成后,p1 开始运行。而且 p3 永远没有机会。或者可能是在 p2 完成后,p3 运行。这使得 p3 延迟。在这种情况下,可能会发生互斥超时。

这是其中一种情况 - 我们软件中的错误。由于互斥锁超时而发生崩溃的地方。发生这种情况是因为有人说优先级倒置。这已通过将 mutex 属性设置为优先继承来解决。我试图对修复进行事后分析,但我坚持优先级反转的基本原理。我已经阅读了很多帖子 - 火星路径查找器,但我被我的问题所困扰。请在这里帮助我。

4

2 回答 2

2

如果 p2 也在互斥体上等待,则不会发生优先级反转问题。在这种情况下,p1 运行直到完成,然后解锁互斥体,调度程序可以调度 p3 下一个。

假设 p2 没有等待。相反,它做了一些完全不同的事情,这需要大量的 CPU 周期。当 p2 运行时,p1 将获得很少或没有 CPU 资源。所以 p1 永远不会(或在很长一段时间后)完成并解锁互斥锁。当 p2 最终完成并且不再使用 CPU 时,p1 将再次获得 CPU 时间,完成并解锁互斥锁。现在 p3 可以继续。

在那种情况下,p3 必须等到 p2 完成,即使 p3 的优先级高于 p2 的优先级。

当所有线程都在竞争相同的资源时,优先级反转问题就不是问题了。当涉及不同的资源(在我的示例中,互斥锁和 CPU 时间)时,这是一个问题,低优先级线程阻塞了一个资源,高优先级线程正在等待该资源,但低优先级线程无法释放它资源,因为中等优先级线程阻止低优先级线程运行。

优先级继承的作用是:当 p3 等待互斥体时,p1 将“继承” p3 的优先级。因此 p1 将获得 CPU 而不是 p2,这意味着它可以尽快完成任务并释放互斥锁。一旦 p1 释放了互斥体,它将返回到自己的优先级,调度器将允许 p3 运行(因为 p1 已完成,p2 的优先级低于 p3 的优先级)。

于 2014-01-01T10:22:37.477 回答
0

要理解这一点,最好定义任务的优先级 p1,p2 和 p3 ,优先级将是 p1 < p2 < p3。

在没有优先级反转的正常情况下,即当更高优先级的任务想要运行时没有任何互斥锁,它只是先于低优先级的任务。

获取互斥体将导致禁用抢占。优先级反转可以仅用 p1 和 p3 来解释。与您的示例一样, p1 已获得锁。

现在 p3 在尝试获取锁时是最高优先级,它被阻塞了。

这是优先级反转,其中较高优先级的任务通过持有较高优先级任务所需的资源而被较低优先级阻止运行。

请参阅此内容以进一步了解, 什么是优先级反转?

于 2015-07-15T09:07:59.087 回答