什么是優先級反轉(翻轉)
優先級反轉,是指在使用信號量時,可能會出現的這樣一種不合理的現象,即:
高優先級任務被低優先級任務阻塞,導致高優先級任務遲遲得不到調度。但其他中等優先級的任務卻能搶到CPU資源。-- 從現象上來看,好像是中優先級的任務比高優先級任務具有更高的優先權。
具體來說:當高優先級任務正等待信號量(此信號量被一個低優先級任務擁有着)的時候,一個介於兩個任務優先之間的中等優先級任務開始執行——這就會導致一個高優先級任務在等待一個低優先級任務,而低優先級任務卻無法執行類似死鎖的情形發生。
一個具體的例子:
假定一個進程中有三個線程Thread1(高)、Thread2(中)和Thread3(低),考慮下圖的執行情況。

- T0時刻,Thread3運行,並獲得同步資源SYNCH1;
- T1時刻,Thread2開始運行,由於優先級高於Thread3,Thread3被搶占(未釋放同步資源SYNCH1),Thread2被調度執行;
- T2時刻,Thread1搶占Thread2;
- T3時刻,Thread1需要同步資源SYNCH1,但SYNCH1被更低優先級的Thread3所擁有,Thread1被掛起等待該資源
- 而此時線程Thread2和Thread3都處於可運行狀態,Thread2的優先級大於Thread3的優先級,Thread2被調度執行。最終的結果是高優先級的Thread1遲遲無法得到調度,而中優先級的Thread2卻能搶到CPU資源。
上述現象中,優先級最高的Thread1要得到調度,不僅需要等Thread3釋放同步資源(這個很正常),而且還需要等待另外一個毫不相關的中優先級線程Thread2執行完成(這個就不合理了),會導致調度的實時性就很差了。
什么是優先級繼承
優先級繼承就是為了解決優先級反轉問題而提出的一種優化機制。其大致原理是讓低優先級線程在獲得同步資源的時候(如果有高優先級的線程也需要使用該同步資源時),臨時提升其優先級。以前其能更快的執行並釋放同步資源。釋放同步資源后再恢復其原來的優先級。

與上圖相比,到了T3時刻,Thread1需要Thread3占用的同步資源SYNCH1,操作系統檢測到這種情況后,就把 Thread3的優先級提高到Thread1的優先級。此時處於可運行狀態的線程Thread2和Thread3中,Thread3的優先級大於Thread2的優先級,Thread3被調度執行。
Thread3執行到T4時刻,釋放了同步資源SYNCH1,操作系統恢復了Thread3的優先級,Thread1獲得了同步資源SYNCH1,重新進入可執行隊列。處於可運行狀態的線程Thread1和Thread2中,Thread1的優先級大於Thread2的優先級,所以Thread1被調度執行。
通過優先級繼承機制,可以有效解決優先級反轉問題,使優先級最高的Thread1獲得執行的時機提前。
鏈接:https://www.jianshu.com/p/c1f7aa944dda