优先级反转的经典案例——火星拓荒者
火星拓荒者(Mars Pathfinder)是一艘在1997年攜帶探測(cè)車登陸火星并建立基地的美國(guó)太空船。它包括命名為卡爾薩岡紀(jì)念站的登陸者,和一輛重量很輕 (10.6公斤/23磅),命名為旅居者號(hào)的輪型機(jī)器人火星車。這艘太空船于火星全球探勘者號(hào)發(fā)射一個(gè)月之后的1996年12月4日由德爾它 II發(fā)射,并于1997年7月4日于火星上稱為歐克西亞沼區(qū)的克里斯平原阿瑞斯谷著陸。
火星拓荒者號(hào)著陸后﹐開始把數(shù)據(jù)傳送回地球。幾天后,信息和圖像傳送就被一系列的總系統(tǒng)復(fù)位所中斷。對(duì)于軟件工程師來(lái)說(shuō),這個(gè)問題是被如何診斷和解決的,仍然是一個(gè)引人入勝的故事。
1. 什么是優(yōu)先級(jí)反轉(zhuǎn)?
優(yōu)先級(jí)反轉(zhuǎn)是指一個(gè)低優(yōu)先級(jí)的任務(wù)持有一個(gè)被高優(yōu)先級(jí)任務(wù)所需要的共享資源。高優(yōu)先級(jí)任務(wù)由于因資源缺乏而處于阻塞狀態(tài),一直等到低優(yōu)先級(jí)任務(wù)釋放資源為止。而低優(yōu)先級(jí)獲得的CPU時(shí)間少,如果此時(shí)有優(yōu)先級(jí)處于兩者之間的任務(wù),并且不需要那個(gè)共享資源,則該中優(yōu)先級(jí)的任務(wù)反而超過這兩個(gè)任務(wù)而獲得CPU時(shí)間。如果高優(yōu)先級(jí)等待資源時(shí)不是阻塞等待,而是忙循環(huán),則可能永遠(yuǎn)無(wú)法獲得資源,因?yàn)榇藭r(shí)低優(yōu)先級(jí)進(jìn)程無(wú)法與高優(yōu)先級(jí)進(jìn)程爭(zhēng)奪CPU時(shí)間,從而無(wú)法執(zhí)行,進(jìn)而無(wú)法釋放資源,造成的后果就是高優(yōu)先級(jí)任務(wù)無(wú)法獲得資源而繼續(xù)推進(jìn)。
簡(jiǎn)而言之,中優(yōu)先級(jí)的線程一直占據(jù)著CPU,導(dǎo)致低優(yōu)先級(jí)線程無(wú)法執(zhí)行,而高優(yōu)先級(jí)線程必須等待低優(yōu)先級(jí)線程執(zhí)行完釋放資源(共享資源)才能執(zhí)行。
2. 故障發(fā)生
故障源自于操作系統(tǒng)中經(jīng)典的優(yōu)先級(jí)反轉(zhuǎn)問題。
火星探測(cè)器有一個(gè)信息總線,有一個(gè)高優(yōu)先級(jí)的總線管理任務(wù)負(fù)責(zé)總線數(shù)據(jù)的存取,訪問總線都需要通過一個(gè)互斥鎖;還有一個(gè)低優(yōu)先級(jí)的,運(yùn)行不是很頻繁的氣象搜集任務(wù),它需要對(duì)總線寫數(shù)據(jù),也就同樣需要訪問互斥鎖;最后還有一個(gè)中優(yōu)先級(jí)的通信任務(wù),它的運(yùn)行時(shí)間比較長(zhǎng)。
平常,這個(gè)系統(tǒng)運(yùn)行毫無(wú)問題,但是有一天,在氣象任務(wù)獲得互斥鎖往總線寫數(shù)據(jù)的時(shí)候,一個(gè)中斷發(fā)生導(dǎo)致通信任務(wù)被調(diào)度就緒,通信任務(wù)(中優(yōu)先級(jí))搶占了低優(yōu)先級(jí)的氣象任務(wù),而無(wú)巧不成書的是,此時(shí)高優(yōu)先級(jí)的總線任務(wù)正在等待氣象任務(wù)寫完數(shù)據(jù)歸還互斥鎖,但是由于通信任務(wù)搶占了CPU并且運(yùn)行時(shí)間比較長(zhǎng),導(dǎo)致氣象任務(wù)得不到CPU時(shí)間也無(wú)法釋放互斥鎖,本來(lái)是高優(yōu)先級(jí)的總線管理任務(wù)也無(wú)法執(zhí)行,總線任務(wù)無(wú)法及時(shí)執(zhí)行的后果被火星探路者系統(tǒng)認(rèn)為是一個(gè)嚴(yán)重錯(cuò)誤,最后就是整個(gè)系統(tǒng)被重啟。
3. 解決方案
解決優(yōu)先級(jí)反轉(zhuǎn)的一個(gè)方法就是優(yōu)先級(jí)捐贈(zèng)??紤]高,中,和低優(yōu)先級(jí)線程H,M和L. 如果H需要等待L(例如,L正在持有鎖),并且M在就緒等待列表中,則H 將永遠(yuǎn)不會(huì)獲得CPU,所以在L持有鎖的同時(shí),H需要將其優(yōu)先級(jí)“捐贈(zèng)”給L,L獲得了高優(yōu)先級(jí),這使得L能夠搶占M。然后一旦L釋放(并因此H獲得)鎖,便撤回捐贈(zèng),回到原來(lái)的低優(yōu)先級(jí)。
具體來(lái)說(shuō),在一個(gè)線程獲取一個(gè)鎖的時(shí)候, 如果擁有這個(gè)鎖的線程優(yōu)先級(jí)比自己低就提高它的優(yōu)先級(jí),然后在這個(gè)線程(擁有鎖的線程)釋放掉這個(gè)鎖之后把這個(gè)鎖的線程改回原來(lái)的優(yōu)先級(jí)。
Vxworks允許優(yōu)先級(jí)繼承,然而遺憾的是,工程師們將這個(gè)選項(xiàng)關(guān)閉了。
工程師們最終發(fā)現(xiàn)了優(yōu)先級(jí)反轉(zhuǎn)。為了解決這個(gè)問題,工程師們開啟了一個(gè)布爾參數(shù),來(lái)指示是否應(yīng)該進(jìn)行互斥鎖定的優(yōu)先級(jí)繼承。 上述的互斥鎖定已經(jīng)把該參數(shù)關(guān)閉;如果打開它,優(yōu)先級(jí)反轉(zhuǎn)就能被阻止,故障就這樣被修復(fù)完成了。
參考來(lái)源:https://www.zhihu.com/question/21460912/answer/18299338
總結(jié)
以上是生活随笔為你收集整理的优先级反转的经典案例——火星拓荒者的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: List集合的五种遍历方式:
- 下一篇: vim打开文件跳转到上次编辑的位置