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