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