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