2014-03-24 31 views

回答

4

OP给出了一个例子,其中优先级继承是可取的。我们在最高优先级和最低优先级的线程之间有一个短的受互斥锁保护的事务,并且具有中等优先级的长时间运行的线程可以在不使用优先级继承的情况下阻止事务。同样在这个例子中,高优先级的线程比中等优先级的线程更重要。

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

想象一下,应用程序应该以高优先级的线程每秒处理100个中断。每秒中断10次,中等优先级线程(每个中断需要30 ms处理)。低优先级线程可以锁定某些资源(与高优先级线程一起使用)。有时(很少)它可以锁定它很长一段时间(1秒)。通过优先级继承,通过高优先级线程首次访问此资源可提高后台线程的优先级,时间长达1秒。所以中等优先级的线程会错过10个中断。同时高优先级的线程可能会错过100个中断。没有优先级继承,中等优先级线程服务于所有中断,但高优先级线程会丢失多达130个中断。如果中等优先级线程提供的中断更有价值,我们应该优先禁用优先级继承。

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


还有一些应用,其中优先级继承不给任何好处:

  • 当有(1)一些后台线程和(2)几个短版活优先级的线程。每组线程仅在其自己的组内共享资源。具有优先级3 & 4通过螺纹等
  • 当处理器具有多个核之外还有在应用时间关键的线程 -
  • 当一个资源被线程共享的具有优先级1 & 2,另一个。
  • 在许多其他情况下。

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

+0

谢谢你的回答!尽管如此,我仍然不确信。如果线程'X'的结果比线程'Y'的结果更重要,我们不会将线程'X'分配给更高优先级吗?在你的例子中,为什么视频帧捕获线程只有中等优先级?我有点困惑。 –

+0

@AnishRamaswamy:在这个例子中,我们有比视频中断更频繁的音频中断,所以如果视频捕获线程具有更高的优先级,它将阻止来自处理中断的低优先级音频线程(例如,每100ms中的30个) 10个音频中断中的每3个不处理,10个音频帧中的每3个未被捕获,并且这样的音频是无用的。即使音频线程对于此应用程序来说不那么重要,它应该具有更高的优先级。 –

+0

那么,如果我们将音频线程分配给较低优先级并启用优先级继承,会发生什么?这不会阻止你提出的问题吗?或者我完全忽略了这一点? –