我明白什么是优先继承。我也了解到,从火星探路者的系统重置问题,大多数时候,根据操作的关键性,启用/实现优先级继承是好的。
但是,是否存在不希望优先级继承并且如果启用/实施可能实际上会导致问题的情况?如果是这样,您能否提供一个示例,同时最好描述一个问题?
我明白什么是优先继承。我也了解到,从火星探路者的系统重置问题,大多数时候,根据操作的关键性,启用/实现优先级继承是好的。
但是,是否存在不希望优先级继承并且如果启用/实施可能实际上会导致问题的情况?如果是这样,您能否提供一个示例,同时最好描述一个问题?
OP 给出了一个需要优先级继承的例子。我们在最高和最低优先级的线程之间有一个短的互斥保护事务和一个中等优先级的长时间运行的线程,如果不使用优先级继承,它可能会阻塞事务。同样在这个例子中,高优先级线程对于应用程序来说比中等优先级线程更重要。
为了获得不希望的优先级继承,我们可以在所有这些假设与上述示例相反的情况下创建一个应用程序。让我们使最高和最低优先级线程之间的事务比中等优先级线程执行其任务的时间更长。并且让我们假设这个中优先级线程的结果比高优先级线程的结果更重要。
想象一下,一个应用程序应该通过其高优先级线程每秒处理 100 个中断。并且其中等优先级线程每秒有 10 个中断(每个中断需要 30 毫秒来处理)。低优先级线程可以锁定一些资源(与高优先级线程一起使用)。有时(非常罕见)它可能会锁定很长时间(1 秒)。通过优先级继承,高优先级线程首先访问此资源可将后台线程的优先级提高最多 1 秒。这样中等优先级的线程就会错过 10 个中断。同时高优先级线程可能会错过 100 个中断。如果没有优先级继承,中等优先级线程会处理所有中断,但高优先级线程会错过多达 130 个中断。如果中等优先级线程服务的中断更有价值,
我从未见过这样的现实应用程序。所以我发明了一个来说明这个案例。让它成为一个视频捕获应用程序,在后台执行一些计算机视觉任务和(作为额外奖励)录音。视频帧由中等优先级线程捕获。声音由高优先级线程捕获(因为否则视频捕获过程可能会阻塞大部分声音中断)。视频被捕获到预先分配的缓冲区。使用静音抑制捕获音频(无需内存即可捕获静音)。所以音频线程需要动态分配内存块(这是我们的共享资源)。计算机视觉任务有时也会分配内存块。当我们内存不足时,垃圾收集器线程会阻塞内存分配并做一些工作。在这里,没有优先继承的视频捕捉完美无缺。
还有一些应用程序优先级继承没有任何好处:
如果在这种情况下启用优先级继承,我们只能降低一些性能(或功率效率),因为内核中的优先级继承实现很可能需要一些额外的资源。