【问题标题】:Are there any cases where priority inheritance is not desirable?是否存在不希望优先继承的情况?
【发布时间】:2014-03-24 17:36:03
【问题描述】:

我明白什么是优先继承。我也从Mars Pathfinder's system reset issue 了解到,在大多数情况下,根据操作的关键程度,启用/实现优先级继承是很好的。

但是,在任何情况下,优先级继承是不可取的,如果启用/实现,实际上可能会导致问题?如果是这样,您能否提供一个示例,同时最好描述一个问题?

【问题讨论】:

    标签: language-agnostic real-time scheduling thread-priority


    【解决方案1】:

    OP 给出了一个需要优先级继承的例子。我们在最高和最低优先级的线程之间有一个短的互斥保护事务和一个中等优先级的长时间运行的线程,如果不使用优先级继承,它可能会阻塞事务。同样在这个例子中,高优先级线程对于应用程序来说比中等优先级线程更重要。

    为了获得不希望的优先级继承,我们可以制作一个所有这些假设都与上述示例相反的应用程序。让我们使最高和最低优先级线程之间的事务比中等优先级线程执行其任务的时间更长。并且我们假设这个中优先级线程的结果比高优先级线程的结果更重要。

    想象一个应用程序,它应该通过其高优先级线程每秒处理 100 个中断。并且其中等优先级线程每秒有 10 个中断(每个中断需要 30 毫秒来处理)。低优先级线程可以锁定一些资源(与高优先级线程一起使用)。有时(非常罕见)它可能会锁定很长时间(1 秒)。通过优先级继承,高优先级线程首先访问此资源可将后台线程的优先级提高最多 1 秒。这样中等优先级的线程就会错过 10 个中断。同时高优先级线程可能会错过 100 个中断。如果没有优先级继承,中等优先级线程会处理所有中断,但高优先级线程会错过多达 130 个中断。如果中等优先级线程服务的中断更有价值,我们应该更倾向于禁用优先级继承。

    我从未见过这样的现实应用程序。所以我发明了一个来说明这个案例。让它成为一个视频捕获应用程序,在后台执行一些计算机视觉任务和(作为额外奖励)录音。视频帧由中等优先级线程捕获。声音由高优先级线程捕获(因为否则视频捕获过程可能会阻塞大部分声音中断)。视频被捕获到预先分配的缓冲区。使用静音抑制捕获音频(无需内存即可捕获静音)。所以音频线程需要动态分配内存块(这是我们的共享资源)。计算机视觉任务有时也会分配内存块。当我们内存不足时,垃圾收集器线程会阻塞内存分配并做一些工作。在这里,没有优先继承的视频捕捉完美无缺。但是使用优先级继承音频线程有时会阻塞视频捕获(这被认为对这个应用程序不利)。


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

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

    如果在这种情况下启用优先级继承,我们只能降低一些性能(或电源效率),因为内核中的优先级继承实现很可能需要一些额外的资源。

    【讨论】:

    • 感谢您的回答!我仍然不相信。如果线程'X'的结果比线程'Y'的结果更重要,我们不是将线程'X'分配给更高的优先级吗?在您的示例中,为什么视频帧捕获线程只有中等优先级?我对此有点困惑。
    • @AnishRamaswamy:在这个例子中,我们的音频中断比视频中断更频繁,所以如果视频捕获线程具有更高的优先级,它将阻止低优先级的音频线程处理中断(例如,每个30 of 100 ms),因此每 10 个音频中断中有 3 个保持未处理,每 10 个音频帧中有 3 个未捕获,这样的音频是无用的。即使音频线程对这个应用程序不太重要,它也应该有更高的优先级。
    • 那么如果我们将音频线程分配为具有较低优先级并启用优先级继承会发生什么?这不会阻止你提出的问题吗?还是我完全错过了这里的重点?
    • @AnishRamaswamy:音频线程仍会错过 30% 的中断。优先级继承不能防止这个问题,因为这里既不涉及共享资源,也不涉及互斥锁。
    • +1 啊,我想我现在明白了。不过还有一个问题。您在回答中提到,“但优先级继承音频线程有时会阻止视频捕获”。但是,在您之前的评论(以及您的回答)中,您似乎暗示优先级继承不会影响任何事情,因为每个线程组只在组内共享资源。所以这又有点混乱了。感谢您的耐心等待!
    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 2012-11-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多