前兩天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