一台4分鍾死機5次的電腦,帶人類第一次登上月球
2019年07月20日16:29
圖片:TOM HAUGOMAT | Wired
圖片:TOM HAUGOMAT | Wired

  50 年前的今天,人類第一次登上了月球。這當然不是個能輕鬆拿下的任務,但是當兩位宇航員離開阿波羅 11 的指揮艙、進入月球著陸器時,恐怕誰都沒想到,他們會在一個4 分鍾內連續死機 5 次的製導電腦的幫助下,成為踏上月面的第一批人類。

  來源 科研圈

  撰文 Stephen Witt

  編譯 賈曉璿

  編輯 魏瀟

  看不懂的警報

  1969 年 7 月 20 日,尼爾·阿姆斯特朗(Neil Armstrong)和巴茲·奧爾德林(Buzz Aldrin)正在距離月球地面上方 110 千米的空間軌道上工作:他們需要將自己乘坐的著陸器從阿波羅 11 號指揮艙中分離出來,向那個地球唯一的衛星下降,邁克爾·柯林斯(Michael Collins)則從指揮艙的窗口中目送他們離開。在狹窄的月球著陸器艙內,他們可以通過小小的三角形窗戶看到月球的地表,手邊則是設備控製台,安放在其中的是接下來那個讓他們名垂青史的行動的控製中樞——阿波羅製導計算機。

  大部分太空航行中,宇航員都是乘客。航天器能自動導航,將其位置轉接到任務控製中心(Mission Control)的 IBM 大型機——這種精密的裝置和小型冷庫差不多大,1969 年人們普遍認知里的“計算機”就是這個模樣。當時,航天領域剛剛引入了“微型計算機”,和冰箱差不多大。阿波羅(The Apollo)的製導計算機大概就這麼大,在指揮艙和著陸器上各有一個。它大約 30 公斤,是人類當時所能設計出來的最複雜的設備。

  阿波羅計算機使用的不是笨重的真空管,而是被稱為芯片的矽薄片。每個芯片包含一對邏輯門,每個門是一個簡單的電子開關,對三個輸入進行監測,如果其中有輸入為“開”,輸出便為“關”。約 5600 個這樣的原始集成電路按順序排列,組成了計算機“大腦”中的數字級聯。它安裝在宇航員身後艙壁上一個硬化金屬容器中,用導線和他們面前的控製台相連。

  這些芯片是由加利福尼亞(California)帕洛阿爾托(Palo Alto)的一個科技初創公司仙童半導體(Fairchild Semiconductor)設計的。20 世紀 60 年代初,計算機行業相對分散,貝爾實驗室(Bell Labs)、麻省理工學院(MIT)等研究集團是東海岸的主要力量;仙童半導體則在西海岸異軍突起。阿波羅計劃(Apollo program)花了數十萬美元訂購仙童的元件,為這家羽翼未豐的公司注入了活力。在小型化的需求下,仙童的研發主管戈登·摩爾(Gordon Moore)提出了一個著名的假說,預測集成電路上的元件數量每年都會增加一倍。美國宇航局(NASA)率先使用了矽,宇航員身後艙壁上的計算機就是對摩爾定律(Moore’s law)的概念性證明。

  計算機的控製台連帶著數字鍵盤,看上去和微波爐很相似,小小的顯示屏從後部投射出詭異的綠光。奧爾德林輸入背下來的兩位數命令管理這台設備,三個小面板會返回五位數代碼——他接受過解讀這些數字的訓練。

  當宇航員開始下降的第一階段時,發動機點火,計算機將著陸器送入距月面 15.24 千米的橢圓軌道。而後,奧爾德林會輸入一個新程式,將著陸器從當前軌道送入與之相交的月球軌道。

  接下來的三分鍾,著陸器離月面隕石坑越來越近,到還有 14 千米的時候,阿姆斯特朗旋轉飛行器,將著陸雷達對準月球表面,宇航員則面對地球。月球引力是不均勻的,為應對這一情況,宇航員必須再次進行測量:奧爾德林向控製台輸入了一個命令,想要比較著陸器的計算位置和雷達上的讀數。

  得到的反饋是一聲刺耳的警報。奧爾德林匆忙輸入“5-9-enter”的兩位數代碼,大致可以翻譯成“顯示警報”。控製台返回了錯誤代碼“1202”。儘管已經接受了好幾個月的模擬訓練,奧爾德林還是不知道這個代碼是什麼意思。同樣一頭霧水的阿姆斯特朗隨即用無線電聯繫任務控製中心請求解釋。他的聲音中充滿壓力,但是直到後來兩個人才意識到情況到底有多糟糕。在那個關鍵時刻,在這個像被扔到月球表面的飛鏢一樣的著陸器里,阿波羅製導計算機崩潰了。

  帶重啟保護的系統

  時間退回幾年前,麻省理工學院儀器實驗室(MIT’s Instrumentation Laboratory)的計算機科學家哈爾·蘭寧(Hal Laning)被邀請設計登月操作系統。他遇到了從未有過的限製:為節省時間,阿波羅的操作系統在處理輸入、提供輸出之間不能有明顯的延遲。為完成著陸,系統必須有足夠的彈性,無論發生人為失誤還是其他錯誤,都要能恢復過來。

  蘭寧的同事因為這項任務對他肅然起敬。他辦公室在一間放著兩台大型計算機、佔據了樓層一大半的空調房隔壁。蘭寧就像父母溺愛孩子一樣關照著這兩台大傢伙。程式員通過桌面大小的控製麵板與計算機進行交互,遇到困難了他們就得穿過大廳和蘭寧討論。計算機代碼不在顯示器上顯示——沒有任何顯示器——而是印在一摞成為“列表”的特大號紙上,程式員用記號筆在上面手寫修改。蘭寧的辦公室被這些列表塞得滿滿的,來討論問題的人連把能坐的椅子都找不到。

  蘭寧曾為計算設定過一次範式。20 世紀 50 年代,他開始為麻省理工第一台數字計算機編程,當時這項任務剛剛完工。編程需要用到複雜的數學符號,為減小自己的工作量,蘭寧設計出一個助手“喬治(George)”,它能將高階代數方程轉換為計算機可以理解的語言。這個早期的編譯器演化出了 Fortran 語言,而後者又衍生出了當今使用的大多數主要計算機編程語言。

  做阿波羅的項目時,蘭寧又這麼做了一次。沒有歷史實例可參考的情況下,他根據直覺決定給阿波羅操作系統中的每個程式分配一個優先級編號。像指導和控製這樣的工作分配的數字較低,會在後台持續運行。它們可以被更高級別的工作打斷,比如來自宇航員的數據請求。最後他做出了一個可以在中央處理器上運行的虛擬並行處理器。

  勾勒出原型機的草圖後,蘭寧回到了自己的辦公室;他的學生查爾斯·蒙茲(Charles Muntz)接手了大部分實際的編程工作。蘭寧方案中的一個問題是,程式中斷太多次可能會堵塞 CPU,就像是變戲法的人扔出了太多的球。蒙茲設計了一種叫做重啟保護(restart protection)的解決方案。如果發送給處理器的任務過多,某些受保護的程式將會把它們的數據吐入內存庫,而後處理器隊列重置,計算機立即重啟,恢復受保護的任務並放棄其餘任務。

  蒙茲的團隊設計完成後,操作系統會被裝在一台大型機上,然後被作為指令打印出來,送到附近一台國防承包商雷聲公司(Raytheon)的設施中。將代碼轉換為機器可讀的二進製編碼,意味著用一種織機將銅線穿過磁芯。大多數織工都是女性,她們的工作要一點點完成:導線穿過磁芯是 1 ;導線在磁芯外面是 0。

  一捆做好的導線叫做纜線。包含操作系統信息的所有纜線做完之後,就把它們插入計算機,進行一系列測試。錯誤代碼 1202 表示處理器過載,蘭寧構造的計算機範式會被強製重啟。在阿波羅 11 號登月前的幾個月,計算機科學家們故意在模擬中引入了大量重啟,操作系統從未丟失關鍵數據。

從阿波羅 11 號指揮艙拍攝的登月艙。圖片來源:NASA
從阿波羅 11 號指揮艙拍攝的登月艙。圖片來源:NASA

  “繼續”還是“中止”?

  可阿姆斯特朗和奧爾德林不知道這些。計算機控製台上方,有一個寫著“中止”(ABORT)的圓形按鈕,按下這個按鈕航天器就會被分成兩部分,爆炸後上半段將被送回軌道,其餘部分則衝入月球。兩位宇航員接受過各種情境下計算機錯誤的訓練;他們在卡納維拉爾角(Cape ­Canaveral)模擬器中操作控製台時相當刻苦,都快把按鍵上的標籤磨沒了。但可能的錯誤代碼有幾十種,他們並沒有全部記住。有些錯誤一個“繼續(go)”的命令就能覆蓋,有些需要按“中止”。怎麼解決得由位於休斯頓的地面指揮中心決定。

  控製中心聽到阿姆斯特朗緊張地請求解釋的時候,事情像反複排練過的那樣進行下去。飛行指揮吉恩·克蘭茲(Gene Kranz)把決定權交給製導官史蒂夫·鮑爾斯(Steve Bales),鮑爾斯向任務專家傑克·加曼(Jack Garman)和拉塞爾·拉森(Russell Larson)求助,專家又查閱了加曼手寫的錯誤代碼。而後加曼和拉森共同證實,錯誤代碼 1202 意味著計算機在崩潰之前已經保存了著陸器的導航數據。“繼續”命令就能解決問題。

  但如果計算機再冒出意料之外的問題怎麼辦?除了運行著陸器的製導系統,計算機還得協助阿姆斯特朗進行轉向和控製。在一定高度(30.48米)以下,不可能再使用“中止”命令,即便計算機發生了故障,阿姆斯特朗也將被迫嚐試著陸。他幾乎沒有犯錯的餘地。如果是硬著陸,宇航員可能當場遇難;情況稍微好點的話,宇航員沒準能倖存,但會被困在月球上。在這場噩夢般的場景中,控製中心要向阿姆斯特朗和奧爾德林告別,在兩人窒息前切斷通訊,留在指揮艙的邁克爾·柯林斯將獨自返航回地球。

  終止登月?或者不終止登月,而後向國會解釋兩名宇航員為何遇難?權衡過後,24 歲的傑克·加曼給出了繼續的信號,而拉爾森害怕得說不出話,只能豎起大拇指表態。貝爾斯做出了最後的決定。直到最近他才透露:“那是個調試警報,飛行時永遠也不該出現。”貝爾斯面前有個顯示器,衡量計算機各項重要指標的的數字看起來沒受影響。“繼續。”他指揮道。休斯頓把這個決定傳達給阿姆斯特朗的時候,時間已經過去了 30 秒。

  阿姆斯特朗重新開始評估路線。此前,阿波羅 10 號已經對著陸區域進行了偵察,這些照片阿姆斯特朗已經研究了很長時間,把地標都刻進了腦海里。在這之前他發現飛行軌跡有點長,但在他真正做出反應之前,奧爾德林向計算機查詢了高度數據。和上次一樣,他得到的是一聲警報,電腦又死機了。

  回到麻省理工,一個通過開放線路連接到控製中心的對講機周圍,圍了好幾十人。其中包括 26 歲的唐·埃爾斯(Don Eyles),著陸器最終降落的軟件是他和同事艾倫·克倫普(Allan Klumpp)一起編寫的。第一次重啟讓埃爾斯吃了一驚,第二次則讓他嚇壞了。這不是僅僅一個小故障,而是一串小故障,他擔心任務控製中心沒有完全意識到事情的嚴重後果。

  這一階段的製導程式佔用了計算機處理能力的 87% 左右。奧爾德林的請求又占了大約 3%。中間某段一個不知名的程式佔用了剩下的 10%,再多一點,處理隊列就會超載,引發強製重啟。下一階段著陸佔用的處理能力會更多,那時即使沒有奧爾德林的輸入,計算機也會死機。埃爾斯在回憶錄中寫道:“有些可怕的東西在計算機中運行著,我們不知道它是什麼,也不知道下一步會引發什麼。”

  控製中心發佈第二道命令的時候,埃爾斯和同事面面相覷。埃爾斯沒在指揮隊伍里,但他比休斯頓的任何一個人都瞭解這台計算機的工作方式。它很可能會再次重啟,阿姆斯特朗和奧爾德林離月球表面越近,問題就越嚴重。埃爾斯那時到底推斷出了什麼,可能他未來幾年內也不會公開披露;對他而言,這種情況的解決方法不是“繼續”,而是“中止”。

1969 年的登月任務中,奧爾德林在登月艙。圖片來源:NASA
1969 年的登月任務中,奧爾德林在登月艙。圖片來源:NASA

  又雙叒死機了

  接下來的 3 分鍾,著陸器下降了大概 6 千米。掃瞄過月球荒涼的表面後,阿姆斯特朗開始繪製月球上平原的特徵。(阿波羅計劃定好了著陸時間,這樣太陽會在月球岩石表面投下長長的投影。)計算機自動進入下一階段的降落——它再次重啟,任務中心又給出了“繼續”的指令。但是,距離月球表面不足 610 米的時候,最嚴重的死機發生了。

  警報響起,著陸器的讀數失靈了。將近 10 秒鍾,控製台沒有任何顯示——沒有高度數據,沒有錯誤代碼,只有三塊空白。阿姆斯特朗的心跳加速到每分鍾 150 次,和剛剛完成一次加速衝刺一樣。窗外的月景飛速掠過,阿姆斯特朗成為有史以來離另一個世界最近的人,但他就像一個心煩意亂的司機,注意力全集中在電腦上。所幸控製台最後終於正常了。控製中心確認:又是 1202 錯誤。阿姆斯特朗後來說:“我從沒想過控製台能恢復。”

  警報消除,但幾秒之後又出現了一次重啟,示數再次消失,這最後一次事故發生在距月面約 244 米的地方。這四分鍾內總共發生了五次事故,而休斯頓的命令是繼續下降。地面指揮員把信心寄託在艙壁的匣子裡。貝爾斯告訴我:“‘中止’指令也沒那麼安全,高度越低,越不安全。我一直有種想法沒說出來,在 305 米以下不管多高,阿姆斯特朗會自己採取行動。”

  控製中心靜悄悄的;他們已經不能再給出有用的建議了。依照程式,阿姆斯特朗接管了部分控製權。這一操作減少了計算機的處理負荷,結束了錯誤,但注意力的分散使得阿姆斯特朗超出了指定的降落範圍好幾英里。先前用來熟悉阿波羅 10 號拍下來的照片的那麼多時間都被浪費了。阿姆斯特朗現在可以依靠的只有自己的眼睛。

  他可以看到,寧靜海(The Sea of Tranquility)是個誤稱;近距離看,月面好像被當成靶子打過一樣。阿姆斯特朗駕駛著陸器大致沿月面平行飛行,飛過一個大隕石坑和一塊不合適的碎石地,找到了一塊平坦的、充滿灰塵的區域。奧爾德林近向計算機查詢了能對最後幾秒的著陸進行導航的數據,而且不知道它會不會再次變成空白。

寧靜海的月面圖像。圖片來源:NASA
寧靜海的月面圖像。圖片來源:NASA

  阿姆斯特朗曾在韓國經曆過一次機翼故障;曾在高空從飛機中彈射逃生;也曾把雙子星 8 號(Gemini 8)從劇烈的失重旋轉中解救出來。現在,他正駕駛一艘不聽控製的宇宙飛船,準備在一個外星世界降落。

  計算機最後一次重啟後僅 40 秒,阿姆斯特朗減小了著陸器的前進動力,而後旋轉支架對準月球表面。發動機揚起了一團阻礙視線的塵埃,奧爾德林大聲報出控製台不斷湧出的數字。由於幾乎沒有多餘燃料,著陸器十分緩慢地降落到了月球表面。揚起的塵埃懸浮在陽光下,直到月球的微弱重力將它們拉回地表。

  地球上,計算機科學家們爭先恐後地想要弄清楚處理器過載的原因。奧爾德林和阿姆斯特朗正在月球上行走,但如果計算機一直死機,他們就很難回地球了。如果不想讓宇航員在進入登月艙後爆炸,他們還有 13 個小時。

  在還剩兩三個小時的時候,麻省理工學院的團隊找到了錯誤的來源。由於預感到可能會出現“中止”,奧爾德林一直讓登陸器的交會雷達保持開啟狀態。這一系統指向上級設備,允許計算機跟蹤指令艙中的柯林斯。在降落過程中,交會雷達的轉盤轉到了錯誤的位置。通常這不會引起問題,但由於設計缺陷,系統每過一陣就會向計算機發送大量不必要的請求。這是最糟糕的一種錯誤:不穩定,具有微妙的危險性,而又難以複現。

  阿波羅 11 號的交會雷達系統觸發了這一罕見的錯誤,在著陸過程中最艱難的部分,13% 的計算機資源都被這根指向太空的天線偷走了。幸運的是,程式員認為這些零散的請求是可以捨棄的,每次重啟,它們都會被暫時拒絕。相反,計算機能集中處理導航、製導、控製等關鍵任務。阿波羅計算機的程式員已經確定,這些事是所有程式中最重要的,甚至比運行顯示器的軟件還重要。計算機在清空寄存器時,會試圖保留導航數據,指導航天器接下來去哪。蘭寧和蒙茲設計的範式交織地密密實實,挽救了登陸過程。

  根據控製中心的命令,離開月球之前,阿姆斯特朗和奧爾德林將交會雷達的旋鈕轉到正確的位置,並切斷了它的電源。完成這一粗略的修復之後,在一聲炸響中他們被發射到了月球軌道,留下了空著的下半部分著陸器,還掀翻了之前插在月球表面的美國國旗。他們與柯林斯彙合的三天后,阿波羅 11 號掉落進了太平洋。接下來,等待他們的就成了榮耀——奧爾德林成為登陸火星的倡導者;阿姆斯特朗搬到了辛辛那提(Cincinnati)。柯林斯在回憶錄中承認任務有多危險。當自己看著阿姆斯特朗和奧爾德林準備從月面返回的時候,他這樣寫到:“如果他們不能從月面飛起來,或者又撞回月面,我承認我不會自殺。我還是會回來,但我知道自己會在議論中活一輩子。”

  榮耀與藍圖

  征服了太空飛行的哈爾·蘭寧退居幕後,轉而涉足 3D 建模領域。阿波羅號應用之後,他設計的操作系統又用到了美國海軍的 F-8 戰鬥機上,證明計算機製導飛行控製是可行的。戈登·摩爾在觀察到了阿波羅號對微型矽芯片的無限需求後,離開了仙童,與人聯合創辦了英特爾(Intel)。1971 年,《電子新聞》( Electronic News)的記者唐·赫弗勒(Don Hoefler)調查了在仙童之後如雨後春筍般湧現出的數十家灣區公司,並寫成了一系列文章。它們的標題是“美國矽谷(Silicon Valley)”。

  最後還有唐·埃爾斯——要不是因為沒有得到允許,他肯定會放棄這個任務。在沉澱了 50 年之後,我終於在今年 4 月份趕著見到了他。任務控製中心的指令是否正確?他說:“我認為,在麻省理工,我們的計算機缺點東西,某些未知的東西嚴重影響了我們的軟件。也沒準是我們知道的太多了!控製中心的人只能從外部進行判斷。某種程度上這對他們更容易,我覺得他們的指令下對了。”他停頓了一會。“無論如何,降落任務完成了,所以他們做的肯定沒錯。”

  接著埃爾斯指出了另一個事實:“這是人類第一次駕駛由電腦控製的飛行器。”在降落的最關鍵階段,計算機在 4 分鍾內經曆了 5 次意外重啟,但它的運行穩定性比程式員預想的要好。阿波羅宇宙飛船又承擔了六次任務,但公眾的興趣逐漸減弱。在也許阿波羅登月計劃的真正遺產不是刻在月塵中,而是刻在矽芯片上。奧爾德林和阿姆斯特朗獲得了榮耀,但在著陸器艙壁後的一個金屬盒子裡,保存著現代世界的藍圖。

關注我們Facebook專頁
    相關新聞
      更多瀏覽