火星探路者太空船上的軟件到底怎么了?
火星拓荒者(Mars Pathfinder)是一艘在1997年攜帶探測(cè)車登陸火星并建立基地的美國太空船。它包括命名為卡爾薩岡紀(jì)念站的登陸者,和一輛重量很輕 (10.6公斤/23磅),命名為旅居者號(hào)的輪型機(jī)器人火星車。這艘太空船于火星全球探勘者號(hào)發(fā)射一個(gè)月之后的1996年12月4日由德爾它 II發(fā)射,并于1997年7月4日于火星上稱為歐克西亞沼區(qū)的克里斯平原阿瑞斯谷著陸。
圖1:旅居者號(hào)火星車
火星拓荒者號(hào)著陸后﹐開始把數(shù)據(jù)傳送回地球。幾天后,信息和圖像傳送就被一系列的總系統(tǒng)復(fù)位所中斷。對(duì)于軟件工程師來說,這個(gè)問題是被如何診斷和解決的,仍然是一個(gè)引人入勝的故事。【1】
診斷問題
拓荒者號(hào)的應(yīng)用程序是由 VxWorks 實(shí)時(shí)操作系統(tǒng)(RTOS)來調(diào)度。由于VxWorks提供優(yōu)先級(jí)搶占的線程調(diào)度,依據(jù)相對(duì)緊迫性,具有優(yōu)先級(jí)線程的任務(wù)會(huì)被執(zhí)行。
氣象數(shù)據(jù)采集任務(wù)作為一個(gè)普通的、低優(yōu)先級(jí)線程運(yùn)行,并且使用互斥鎖定(mutexes)來同步的信息總線。其它高優(yōu)先級(jí)的線程在必要時(shí)會(huì)獲得優(yōu)先權(quán),其中包括一個(gè)非常高優(yōu)先級(jí)的總線管理任務(wù),它也以互斥鎖定來訪問總線。不幸的是,在這種情形下,一個(gè)長期運(yùn)行的、具有比氣象任務(wù)更高、但是比總線管理任務(wù)更低優(yōu)先級(jí)的通信任務(wù),阻止了總線管理任務(wù)的運(yùn)行。
不久,一個(gè)看門狗定時(shí)器注意到總線管理任務(wù)已經(jīng)很長時(shí)間沒有被執(zhí)行了,一定是出了什么問題,所以強(qiáng)制總系統(tǒng)復(fù)位。(后來工程師們承認(rèn)在飛行前測(cè)試時(shí)已經(jīng)發(fā)現(xiàn)系統(tǒng)復(fù)位。他們把這些復(fù)位歸類于硬件故障,而去專注于關(guān)鍵任務(wù)――登陸軟件。)
尋求解決方案
工程師們瘋狂的工作在實(shí)驗(yàn)室復(fù)制品上去診斷和解決這個(gè)問題,最終發(fā)現(xiàn)了優(yōu)先級(jí)反轉(zhuǎn)。當(dāng)一個(gè)高優(yōu)先級(jí)任務(wù)間接地被一個(gè)“反轉(zhuǎn)”了相對(duì)優(yōu)先級(jí)的中等優(yōu)先級(jí)任務(wù)優(yōu)先搶占時(shí),則優(yōu)先級(jí)反轉(zhuǎn)發(fā)生(見圖2)。這個(gè)顯然違反了優(yōu)先級(jí)模型――高優(yōu)先級(jí)任務(wù)只能被更高優(yōu)先級(jí)的任務(wù)阻止運(yùn)行,或者被能迅速完成共享資源使用的低優(yōu)先級(jí)任務(wù)短暫地阻止運(yùn)行。
圖2:優(yōu)先級(jí)反轉(zhuǎn)
為了解決這個(gè)問題,他們開啟了一個(gè)布爾參數(shù),來指示是否應(yīng)該進(jìn)行互斥鎖定的優(yōu)先級(jí)繼承。 上述的互斥鎖定已經(jīng)把該參數(shù)關(guān)閉;如果打開它,優(yōu)先級(jí)反轉(zhuǎn)就能被阻止。
根據(jù)優(yōu)先級(jí)繼承,當(dāng)高優(yōu)先級(jí)任務(wù)請(qǐng)求信號(hào)(semaphore)時(shí),持有信號(hào)的任務(wù)優(yōu)先級(jí)繼承高優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí)。在圖2中,當(dāng)任務(wù)“high”請(qǐng)求信號(hào)時(shí),任務(wù)“low”將繼承任務(wù)“high”的優(yōu)先級(jí)。這使得“low”能優(yōu)先搶占“medium”。
造成問題(對(duì)其它兩個(gè)也可能造成同樣的問題)的互斥鎖定的初始化參數(shù)存儲(chǔ)在一個(gè)全局變量中,其地址放在發(fā)射軟件的符號(hào)表里。因?yàn)閂xWorks包含一個(gè)C語言解釋器,允許開發(fā)人員輸入和執(zhí)行C表達(dá)式和函數(shù)來進(jìn)行系統(tǒng)調(diào)試。它可以給太空船上傳一個(gè)簡短的C程序。在解釋C程序時(shí),可以改變這些變量的值從假(FALSE)到真(TRUE)。這就杜絕了系統(tǒng)復(fù)位問題。
工程師們學(xué)到了什么?
- 只有對(duì)實(shí)際系統(tǒng)行為的詳細(xì)追蹤,才能捕獲和識(shí)別錯(cuò)誤執(zhí)行序列。而對(duì)一個(gè)不能追蹤的黑盒子來說,是無法診斷的;
- 系統(tǒng)中具備調(diào)試工具是非常重要的。如果不能修改系統(tǒng),則問題無法修正;
- 花費(fèi)額外的時(shí)間確保在測(cè)試階段的優(yōu)先級(jí)繼承正確性,甚至犧牲一些本來非常寶貴的額外性能開銷。
解決方案來源
當(dāng)主講人提到一份論文――它第一個(gè)識(shí)別優(yōu)先級(jí)反轉(zhuǎn)問題,并且提出了解決方案。特別的事發(fā)生了――令人驚訝的是,作者們都在房間里,收到了熱情的接待。論文原文是:
L. Sha, R. Rajkumar, and J. P. Lehoczky. Priority Inheritance Protocols: An Approach to Real-Time Synchronization. In IEEE Transactions on Computers, vol. 39, pp. 1175-1185, Sep. 1990.
【1】本摘要根據(jù)麥克•瓊斯(Mike Jones)于1997年12月所記錄的風(fēng)河系統(tǒng)(Wind River Systems)公司首席技術(shù)官大衛(wèi)•維爾納(David Wilner)在IEEE實(shí)時(shí)操作系統(tǒng)研討會(huì)上的專題演講。
原文鏈接: rapita systems 翻譯: 伯樂在線 - 伯樂在線讀者投稿