前兩天Marvell面試,被問到優先級反轉是什么東東,無奈只能表示不會,還好面試官非常地NICE,很耐心地告訴我這是什么,還聊起NASA的火星探測器就因為優先級反轉的原因出現過BUG, 我就一直點頭,還說回來會GOOGLE學習下
Priority Inversion 優先級反轉是嵌入式實時系統里面的一個經典的問題。簡單描述一下這個問題:有三個優先級不同的task,A,B,C; A的優先級最高,B次之,C最低。其中A和C有共享的臨界區。如果C已進入臨界區,那么A在進入進入臨界區之前,就會被阻塞。task B有可能打斷C而進入運行狀態,這樣C什么時候從臨界區退出,就是一個未知的時間。A只有C從臨界區退出后才能被調度,A被阻塞的時間也是未知的。這樣,低優先級的B先于高優先級的A被調度,優先級發生了逆轉。
這個問題在一般的操作系統里面不是一個嚴重的問題,最多A被多阻塞了一段時間。但是,在實時系統里面,如果一個任務在規定的時間里面沒有被調度運行,系統就相當于失敗了,可能引發系統崩潰。
解決這個問題有兩種手段:
1:Priority inheritance(優先級繼承),如果一個高優先級的task被阻塞,與它共享臨界區的低優先級的task在進入臨界區后,優先級就會繼承高優先級task的優先級,保證它不會被其他優先級次高的任務打斷。從臨界區退出后,C的優先級恢復正常。
2:A priority ceiling(最高優先級),給臨界區分配最高優先級,如果一個task進入臨界區,就把臨界區的優先級賦給它,已保證它不會被打斷。從臨界區退出后,task的優先級恢復正常。
實時操作系統的一個特點就是,一個實時任務,會在規定的時間內得到響應,并且在規定的時間內完成任務。所以,一切不可預知的動作都是有害的。
有興趣可以看看下面兩個鏈接:
http://en.wikipedia.org/wiki/Priority_inversion
http://www.embedded.com/story/OEG20020321S0023
來源:
http://www.kernelchina.org/node/210