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