language-agnostic - 是否存在不希望优先继承的情况?

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

我明白什么是优先继承。我也明白了,来自Mars Pathfinder's system reset issue ,大多数时候,根据操作的关键性,启用/实现优先级继承是很好的。

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

最佳答案

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

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

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

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

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

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

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

    关于language-agnostic - 是否存在不希望优先继承的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22616600/

    相关文章:

    java - 是否有允许动态增长并扩展 java.nio.ByteBuffer 的 ByteBuffer 实现?

    ios - 多个绘图空间或移动的轴/图

    c++ - 任务委托(delegate)调度器

    Java 执行器模型,仅允许在实例化线程上运行任务

    algorithm - 有什么聪明的方法可以输出 n 个项目的列表,中间有 (n-1) 个分隔符?

    multithreading - 如何避免可变状态(多线程时)

    algorithm - 最小化函数

    x86 - x86 CPU 上中断延迟的估计

    c++ - 为多处理器查找 DAG 的静态调度 - 库?

    language-agnostic - 什么代码度量使您相信提供的代码是 "crappy"?