(多年前的真實經歷)
面試官:懂不懂RTOS?
小白:懂一點。
面試官:你來講一下什么是優先級翻轉,什么是優先級繼承。
小白:……
曾經一度以為是因為自己沒答上來,而失去了一份心儀已久的offer,但實際上哪怕答上來我也可能只是個joke.
優先級的翻轉與繼承發生在什么情況下?
1. 首先這里所說的都是任務級的優先級(中斷也是有優先級的,那歸NVIC管,RTOS插不上手)
2. 必須是多任務運行情況下(至少三個以上的任務)。
3.不同優先級任務之間存在同步的關系(尤其是高優先級任務與低優先級任務之間有愛恨糾葛)。
接下來看一看優先級繼承與翻轉出現的情況。
優先級翻轉的運行順序:
時刻一: Task3正在運行態,并且正在訪問某個共享資源。
時刻二: 這個時候Task1 變為就緒態,于是搶占Task3任務,搶占發生后,Task1變為運行態,Task3變為就緒態。
時刻三: 假如在這一時刻,Task2從阻塞態變為了就緒態,但是由于Task1在運行態,所以他只能等待。
時刻四:Task1在運行過程中,需要訪問某個共享資源,但資源被Task3占用,于是Task1進入阻塞態。
獵殺時刻到來:Task1進入阻塞態,調度器需要從就緒任務列表中,讀取當前已經就緒的任務,選擇優先級較高的任務,讓其進入運行態。目前在就緒任務列表中的任務有個Task2和Task3,該誰進入運行態呢?
情況一(當任務間應用二值信號量進行資源獲取時發生):
Task2進入運行態的情況,由于Task2 < Task1 ,所以站在應用的角度來看優先級發生了翻轉。
情況二(當任務間應用互斥信號量進行資源獲取時發生):
Task3進入運行態的情況,由于Task3 < Task2,所以站在應用的角度來看,Task3先于Task2運行,更像是Task3繼承了Task1的優先級,而發生了優先級搶占。
總結一下:
不論是優先級繼承還是優先級翻轉,都不是錯誤,對于調度器來講都只能算是常規操作,他只是根據同步的類型以及任務的優先級,進行了確定性的判斷,并調整任務的狀態而已。
應用看起來有點怪或者是異常都是由設計者導致的,你比如常規的操作造成死鎖,掛掉整個應用,你也不能怪調度器不是。
題外話:
其實一切都沒那么復雜,在你真正實踐的時候就能掌握所有細節。