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