一台4分钟死机5次的电脑,带人类第一次登上月球
50 年前的今天,人类第一次登上了月球。这当然不是个能轻松拿下的任务,但是当两位宇航员离开阿波罗 11 的指挥舱、进入月球着陆器时,恐怕谁都没想到,他们会在一个4 分钟内连续死机 5 次的制导电脑的帮助下,成为踏上月面的第一批人类。
图片:TOM HAUGOMAT | Wired
来源:科研圈
撰文 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
“继续”还是“中止”?
可阿姆斯特朗和奥尔德林不知道这些。计算机控制台上方,有一个写着“中止”(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
又双叒死机了
接下来的 3 分钟,着陆器下降了大概 6 千米。扫描过月球荒凉的表面后,阿姆斯特朗开始绘制月球上平原的特征。(阿波罗计划定好了着陆时间,这样太阳会在月球岩石表面投下长长的投影。)计算机自动进入下一阶段的降落——它再次重启,任务中心又给出了“继续”的指令。但是,距离月球表面不足 610 米的时候,最严重的死机发生了。
警报响起,着陆器的读数失灵了。将近 10 秒钟,控制台没有任何显示——没有高度数据,没有错误代码,只有三块空白。阿姆斯特朗的心跳加速到每分钟 150 次,和刚刚完成一次加速冲刺一样。窗外的月景飞速掠过,阿姆斯特朗成为有史以来离另一个世界最近的人,但他就像一个心烦意乱的司机,注意力全集中在电脑上。所幸控制台最后终于正常了。控制中心确认:又是 1202 错误。阿姆斯特朗后来说:“我从没想过控制台能恢复。”
警报消除,但几秒之后又出现了一次重启,示数再次消失,这最后一次事故发生在距月面约 244 米的地方。这四分钟内总共发生了五次事故,而休斯顿的命令是继续下降。地面指挥员把信心寄托在舱壁的匣子里。贝尔斯告诉我:“‘中止’指令也没那么安全,高度越低,越不安全。我一直有种想法没说出来,在 305 米以下不管多高,阿姆斯特朗会自己采取行动。”
控制中心静悄悄的;他们已经不能再给出有用的建议了。依照程序,阿姆斯特朗接管了部分控制权。这一操作减少了计算机的处理负荷,结束了错误,但注意力的分散使得阿姆斯特朗超出了指定的降落范围好几英里。先前用来熟悉阿波罗 10 号拍下来的照片的那么多时间都被浪费了。阿姆斯特朗现在可以依靠的只有自己的眼睛。
他可以看到,宁静海(The Sea of Tranquility)是个误称;近距离看,月面好像被当成靶子打过一样。阿姆斯特朗驾驶着陆器大致沿月面平行飞行,飞过一个大陨石坑和一块不合适的碎石地,找到了一块平坦的、充满灰尘的区域。奥尔德林近向计算机查询了能对最后几秒的着陆进行导航的数据,而且不知道它会不会再次变成空白。
宁静海的月面图像。图片来源: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 次意外重启,但它的运行稳定性比程序员预想的要好。阿波罗宇宙飞船又承担了六次任务,但公众的兴趣逐渐减弱。也许阿波罗登月计划的真正遗产不是刻在月尘中,而是刻在硅芯片上。奥尔德林和阿姆斯特朗获得了荣耀,但在着陆器舱壁后的一个金属盒子里,保存着现代世界的蓝图。