優先順序反轉(priority inversion)
指某同步資源被較低優先順序的程序
/執行緒所擁有,較高優先順序的程序
/執行緒競爭該同步資源時未獲得該資源,而使得較高優先順序程序
/執行緒反而推遲被排程執行的現象。
對基於優先順序排程的實時系統,優先順序高的程序/執行緒被優先排程是排程演算法首要考慮的因素。
假定乙個程序中有三個執行緒
thread1
、thread2
和thread3
,它們的優先順序順序是
圖1 優先順序反轉
上述現象中,優先順序最高的
thread1
既要等優先順序低的
thread2
執行完,還要等優先順序更低的
thread3
執行完之後才能被排程,如果
thread2
和thread3
執行的很費時的操作,顯然
thread1
的被排程時機就不能保證,整個實時排程的效能就很差了。
優先順序繼承(priority inheritance)
優先順序繼承也就是,高優先順序程序t
h在等待低優先順序的執行緒t
l繼承占用的競爭資源時,為了使t
h能夠盡快獲得排程執行,由作業系統把t
l的優先順序提高到t
h的優先順序,從而讓tl以t
h的優先順序參與排程,盡快讓t
l執行並釋放t
h欲獲得的競爭資源,然後t
l的優先順序調整到繼承前的水平,此時t
h可獲得競爭資源而繼續執行。
有了優先順序繼承,上述優先順序反轉的執**況是:
圖2 優先順序繼承
與圖一比較,圖二中,到了t3時刻,thread1需要thread3占用的同步資源synch1,作業系統檢測到這種情況後,就把thread3的優先順序提高到thread1的優先順序。此時處於可執行狀態的執行緒thread2和thread3中,thread3的優先順序大於thread2的優先順序,thread3被排程執行。
thread3執行到t4時刻,釋放了同步資源synch1,作業系統這時恢復了thread3的優先順序,thread1獲得了同步資源synch1,重新進入可執行佇列。處於可執行狀態的執行緒thread1和thread2中,thread1的優先順序大於thread2的優先順序,所以thread1被排程執行。
上述機制,使優先順序最高的thread1獲得執行的時機提前。
小趣聞:
這裡還有乙個八卦,2023年的美國的火星探測器(使用的就是vxworks)就遇到乙個優先順序反轉問題引起的故障。簡單說下,火星探測器有乙個資訊匯流排,有乙個高優先順序的匯流排任務負責匯流排資料的訪問,訪問匯流排都需要通過乙個互斥鎖(共享資源出現了);還有乙個低優先順序的,執行不是很頻繁的氣象蒐集任務,它需要對匯流排寫資料,也就同樣需要訪問互斥鎖;最後還有乙個中優先順序的通訊任務,它的執行時間比較長。平常這個系統執行毫無問題,但是有一天,在氣象任務獲得互斥鎖往匯流排寫資料的時候,乙個中斷發生導致通訊任務被排程就緒,通訊任務搶占了低優先順序的氣象任務,而無巧不成書的是,此時高優先順序的匯流排任務正在等待氣象任務寫完資料歸還互斥鎖,但是由於通訊任務搶占了cpu並且執行時間比較長,導致氣象任務得不到cpu時間也無法釋放互斥鎖,本來是高優先順序的匯流排任務也無法執行,匯流排任務無法及時執行的後果被探路者認為是乙個嚴重錯誤,最後就是整個系統被重啟。vxworks允許優先順序繼承,然而遺憾的工程師們將這個選項關閉了。
優先順序反轉
1.優先順序反轉 priority inversion 由於多程序共享資源,具有最高優先權的程序被低優先順序程序阻塞,反而使具有中優先順序的程序先於高優先順序的程序執行,導致系統的崩潰。這就是所謂的優先順序反轉 priority inversion 2.產生原因 其實,優先順序反轉是在高優級 假設為...
優先順序反轉
實時作業系統中,在訊號量使用過程中,則可能出現優先順序反轉的不合理情況。1.優先順序翻轉出現場景 高優先順序的任務被低優先順序的任務阻塞,導致高優先順序任務得不到排程和執行。但是其他中等優先順序的任務卻能搶占到cpu資源。從現象看好像是中優先順序任務比高優先順序任務具有更高的優先權。當系統高優先順序...
優先順序反轉 zz
定義 高優先級任務需要等待低優先級任務釋放資源,而低優先級任務又正在等待中等優先級任務的現象叫做優先級反轉。兩種經典的防止反轉的方法 優先級繼承策略 priority inheritance 繼承現有被阻塞任務的最高優先級作為其優先級,任務退出臨界區,恢復初始優先級。優先級天花板策略 priorit...