通过1997年拓荒者号飞行器事件理解优先级反转
??? 拓荒者號飛行器在1997年7月4日登陸火星,并開始收集星球上的數據,并將數據傳送回地球。但是在任務開始幾天后,飛行器就開始經歷重置整個系統的bug。這導致了大量珍貴的采集數據的丟失。在經歷了制作團隊(Jet Propulsion Laboratory)巨大的努力排查之后,發現問題的根源在于系統調度中的優先級翻轉問題。
??? 對于任何一個設置優先級的操作系統,系統都會先執行優先級最高的任務。優先級翻轉是指當系統由于某些原因不得不等待低優先級的任務完成,才讓高優先級任務執行的情況。這種看似不合理的情況是非常容易發生的。比如說,為了保證系統運行結果的正確性,公共變量不得不在被使用時先“鎖”起來。當程序A在執行過程中,如果占用了某個公共變量X,任何其他的程序,比如B都不可以訪問這個變量X。B能做的只有等待A在使用完這個變量,并且釋放了對這個變量的控制權之后,才可以去訪問這個公共變量X。通常實現這個的方法是設置semaphore。當B的優先級比A高的時候,優先級翻轉的問題就隨之產生了。
???? 優先級翻轉還會帶來一個問題,就是在高優先級任務等待低優先級任務完成的時候,可能這個高優先級任務本身就會錯過完成的截止日期,這反過來又會影響到其他的程序,翻來覆去就會對整個系統就會造成致命的影響。
???? 回到拓荒者飛行器的故事上,簡單來說它的操作系統總共設置了3個任務,優先級依次下降:
T1:周期性的檢測飛行器系統和軟件是否工作正常
T2:處理圖像數據
T3:隨機對某些設備的狀態進行檢測
??? 當任務T1完成后,系統中的看門狗時鐘就會被重置到最大值。如果看門狗的數值降低到負值,也就是說當T1沒有按時完成時,系統就會認為整個操作系統一定是在某個地方出現了比較嚴重的問題,安全起見,操作系統就會重置所有的軟件以及硬件。這個操作會花費大量的時間。同時系統設定,T1和T3共同擁有一個公共數據結構(即變量)。
下圖描述了優先級翻轉發生的過程:
t1時刻:T3開始執行
t2時刻:T3鎖住了semaphore,也就是s,導致其他程序無法訪問公共變量s
t3時刻:T1由于擁有更高的優先級,替代了T3,并讓自己開始執行
t4時刻:T1想要訪問公共變量s,但是由于T3已經鎖住了公共變量s,所以T1無法訪問公共變量s,只好暫停程序
t5時刻:T2由于擁有比T3更高的優先級,于是開始執行
t6時刻:T2由于一些其他的因素暫停執行,這些因素于T1和T_無關,所以T2可能執行了很長時間
t7時刻:T3終于獲得機會執行,在使用完公共變量s并將其釋放后,T1立刻搶占了資源,開始執行
??? 由上述過程可以發現,T1必須等待T2和T3都執行完之后才可以執行完自己的程序。這么做的后果是很有可能T1無法按時完成,導致系統重啟。
??? 一個比較好的解決方案就是,引入優先級繼承的機制,即,在T3鎖住公共變量后,它遍繼承了和它共享這個公共變量的T1的優先級,如下圖所示,這樣就可以很大程度上避免上述問題。具體的步驟如下所示:
t1時刻:T3開始執行
t2時刻:T3鎖住了semaphore,也就是s,導致其他程序無法訪問公共變量s
t3時刻:T1由于擁有更高的優先級,替代了T3,并讓自己開始執行
t4時刻:T1想要訪問公共變量s,但是由于T3已經鎖住了公共變量s,所以T1無法訪問公共變量s,只好暫停程序,但同時,T1將自己的優先級賦予了T3
t5時刻:T2想要執行,但是此時其優先級小于T3,所以暫不執行
t6時刻:T3執行完對于公共區域內的一系列程序,向T1返還優先級。這時T1搶占了T3的資源開始執行
t7時刻:T1執行完畢,換T2執行
轉載于:https://www.cnblogs.com/flowerdrops/p/8717872.html
總結
以上是生活随笔為你收集整理的通过1997年拓荒者号飞行器事件理解优先级反转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为平板 鸿蒙2.0,华为新平板将发布,
- 下一篇: Hibernate配置(核心配置文件.c