优先级继承不可取的情况有哪些?

14

我理解什么是优先级继承。从Mars Pathfinder的系统重置问题中,我也了解到,根据操作的关键性,大多数情况下启用/实现优先级继承是有益的。

然而,是否存在一些情况下不希望启用/实现优先级继承甚至可能导致问题的情况呢?如果有,请提供一个例子并描述问题(最好)。

1个回答

5

OP举了一个例子,说明何时需要使用优先级继承。在这个例子中,我们有最高和最低优先级的线程之间进行短暂的互斥保护事务,以及运行时间较长的中等优先级线程,如果不使用优先级继承,它可能会阻塞该事务。此外,在这个例子中,高优先级线程比中优先级线程更重要。

为了使优先级继承不可取,我们可以制作一个假设与上面的示例相反的应用程序。让我们将最高和最低优先级的线程之间的事务设置为比中等优先级线程执行其任务所需的时间更长。并假设中等优先级线程的结果比高优先级线程的结果更重要。

想象一下一个应用程序,它应该使用其高优先级线程提供100次中断每秒。用中等优先级线程提供10次中断每秒(每个中断需要30毫秒来处理)。低优先级线程可以锁定某些资源(与高优先级线程一起使用)。有时候(很少)它可能会长时间锁定它(1秒)。通过优先级继承,高优先级线程对此资源的第一次访问会提升后台线程的优先级长达1秒钟。使中等优先级线程会错过10个中断。同时高优先级线程可能会错过100个中断。如果中等优先级线程提供的中断更有价值,则应该选择禁用优先级继承。

我从未见过像这样的实际应用程序。所以我发明了一个来说明这种情况。让它成为一个视频捕获应用程序,具有一些计算机视觉任务(作为额外奖励)和声音记录。媒体优先级线程捕获视频帧。高优先级线程捕获声音(否则视频捕获过程可能会阻塞相当大的声音中断部分)。视频被捕获到预分配的缓冲区。使用静音抑制捕获音频(不需要内存来捕获静音)。因此,音频线程需要动态分配的内存块(这是我们的共享资源)。计算机视觉任务有时也会分配内存块。当我们没有内存可用时,垃圾收集器线程会阻止内存分配并执行一些工作。在没有优先级继承的情况下,视频捕获可以无缝工作。但是通过优先级继承,音频线程有时会阻止视频捕获(这在该应用程序中被认为是不好的)。


还有一些应用程序,优先级继承没有任何好处:

  • 当存在(1)多个后台线程和(2)多个短期生存的优先级线程时。每组线程仅在其自身组内共享资源。
  • 当一个资源由具有优先级1& 2的线程共享,另一个资源由具有优先级3& 4的线程共享等等。
  • 当处理器的核心数大于应用程序中时间关键线程的数量时。
  • 在许多其他情况下。

如果在这种情况下启用优先级继承,则可能只会导致某些性能(


谢谢你的回答!但我还是不太确定。如果线程“X”的结果比线程“Y”的结果更重要,那么我们为什么不将线程“X”分配为更高优先级呢?在你的例子中,为什么视频帧捕获线程只有中等优先级?我有点困惑。 - Anish Ramaswamy
在这个例子中,音频中断比视频中断更频繁。如果视频捕获线程具有较高优先级,则会防止低优先级音频线程处理中断(例如,每100毫秒中的30个),因此每10个音频中断中的3个保持未处理,每10个音频帧中的3个未被捕获,这样的音频是无用的。即使对于此应用程序来说音频线程不太重要,它也应该具有较高的优先级。 - Evgeny Kluev
如果我们将音频线程分配为较低优先级并启用优先级继承,会发生什么?这样做不会防止你提出的问题吗?或者我完全误解了吗? - Anish Ramaswamy
@AnishRamaswamy:音频线程仍会错过30%的中断。优先级继承无法解决此问题,因为这里既没有共享资源也没有互斥量。 - Evgeny Kluev
@AnishRamaswamy:在之前的评论中,我们讨论了资源在中低优先级线程之间共享而高优先级线程不与其他人共享的情况。在答案的后半部分,有更多的例子是资源仅在不同组之间共享。但是答案的前半部分完全不同:资源在高低优先级线程之间共享,中等优先级线程在其中。这正是优先级继承改变事物的情况(并且在这里它以不好的方式改变它们)。 - Evgeny Kluev
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接