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