2014-03-24 52 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

那麼,如果我們將音頻線程分配給較低優先級並啓用優先級繼承,會發生什麼?這不會阻止你提出的問題嗎?或者我完全忽略了這一點? –