跳转到内容
← 返回先驱
系统1943–约 15 分钟阅读

巴特勒·兰普森

Butler Lampson

图灵奖Xerox PARC能力系统提示个人计算

1992 年图灵奖颁给巴特勒·兰普森(Butler W. Lampson),表彰的不是单一算法,而是在 SDS 940、Alto、以太网、激光打印、分时与后来的微软研究里反复出现的一种能力:把「计算机应当怎样作为日常对象工作」写成可实现的系统,并把设计判断压缩成工程师能记住的句子。他 1983 年的 Hints for Computer System Design 被复印了四十年,不是因为文笔,是因为那些句子在新系统里仍然能当检查单。

兰普森的贡献分散在许多合作里。人物页若做成发明清单会失真。要看的是几条反复出现的机制:能力(capability)作为权限,端到端作为正确性边界,以及「接口要窄、实现可换」作为进化策略。

破除误解:Alto 不是他一个人的个人电脑

Alto 是 Xerox PARC 的集体产物:泰勒的实验室管理、萨克特的图形、英格巴特传统的交互思想、以太网与激光打印的并行。兰普森在其中做处理器、操作系统与语言方面的关键设计,并写过清晰的系统论文。把 1970 年代的个人计算写成英雄故事,会看不懂为什么同样的思想在 Xerox 没变成主导产品,却在别处长成产业。

第二个误解是把「Hints」当成鸡汤。文中每条提示都有失败模式:过宽的接口会把实现细节冻成永恒;过早的分布式透明会把延迟藏进看似本地的调用;缓存没有失效协议就不是缓存。它是负面清单,不是励志。

第三个误解是能力系统已经被 ACL 取代所以过时。Unix 权限位与今日的云 IAM 仍在处理同一问题:谁能对哪一个对象做什么。seL4 一类内核把能力又做成可证明的对象。兰普森参与的 CAL-TSS 与后来的安全讨论,是这条线的前史,不是博物馆展品。

现场:从 Berkeley 分时到 PARC

兰普森 1943 年生,在哈佛与伯克利受教育,参与 Project Genie 与 SDS 940 上的分时系统。分时把「计算机是机房里的批处理」改成「许多人同时拥有一台看起来属于自己的机器」。保护、调度、交换,成为日常机制。个人工作站后来把「看起来属于自己」做成真的属于自己的硬件;思想是连续的。

在 PARC,Alto 把位图显示、鼠标、本地文件、以太网连成一台可以办公的机器。激光打印把文档从终端字符变成可排版的页面。这些不是应用层的装饰,它们倒逼操作系统提供:帧缓冲、字体、网络栈、后台假脱机。兰普森写过这些系统如何划分层次,使硬件换代时软件不必推倒。

到 DEC SRC 与微软研究院,对象仍是系统:分布式、安全、编程环境。图灵奖认的是这条持续的设计判断,而不是某一年代的产品名。

核心:提示如何变成可检查的约束

Hints 里最硬的几条可以改写成约束。接口应当揭示意图而不是实现;否则优化与移植都会破坏调用者。端到端论证(与萨尔茨等的工作一起进入教材)说:可靠性若只在中间层保证,应用仍要自己检查;中间层不该假装成为正确性的终点。缓存必须有一致性故事。实现可以投机,接口不能撒谎。

安全上,最小权限与完整媒介(complete mediation)要求每一次对象访问都经过检查。能力把检查变成「持有这枚 token」,访问控制表把检查变成「查这张表」。两种实现都在回答兰普森参与过的保护问题。今日云上的签名 URL、IAM 角色、机密计算,仍是同一张问题单的新衣服。见 计算机安全原则。

与 兰波特、利斯科夫 的对照:兰波特把时间与故障写成逻辑;利斯科夫把抽象与容错写成语言与系统;兰普森把日常系统的进化写成可教的工程约束。三人的图灵奖看起来像不同领域,处理的都是「大系统如何在部分失败后仍可理解」。

代价与争议

PARC 的创新没有为 Xerox 赢得个人计算机市场,成了商业史案例。把责任写成「管理不懂」,太便宜。窗口、鼠标、网络办公是一个生态,需要软件分发、价格、开发者工具同时成熟。思想领先于可复制的产业节奏,并不自动成为某人的道德失败。

Hints 也会被引用成停止思考的借口。「保持简单」可以挡住必要的复杂度(一致性协议、内存模型)。兰普森自己的系统并不简单。读提示的正确姿势是当检查单,不是当否决权。

能力系统的可用性一直差:用户不能理解 token 图。因此主流 OS 走向 ACL 与组。安全研究每隔十年把能力请回来一次(浏览器 origin、移动 OS 权限、微内核)。循环说明问题没解决,不是 1970 年代想错了。

核心二:保护域、完整媒介与可进化接口

兰普森 1971 年的 Protection 备忘录已经把访问矩阵写成对象:主体、客体、权。实现可以是表,可以是能力,可以是标签。重要的是每一次访问都要对照矩阵——完整媒介。后来 Unix 把矩阵压成九个权限位加所有者,简单,但把「任意客体上的任意细权」丢掉了。云 IAM 又把矩阵展开,复杂,但接近那张原图。

Alto 与以太网把个人计算做成局域网对象。打印机、文件服务器、其他工作站都是网上的客体。没有保护故事,位图界面只是单机玩具。PARC 的系统工作把「谁能往这台打印机送作业」当成与「如何画窗口」同级的问题。今天的打印假脱机和对象存储 ACL,仍是这个问题的后裔。

Hints 里「实现可投机、接口不撒谎」对 JIT 与弱内存同样适用。处理器可以乱序,架构合同必须可陈述。兰普森写的是操作系统,句子却跨到了微架构:调用者依赖合同,不依赖你今天的流水线宽度。换实现而不换接口,系统才能活过十年。

与微软时期的工作相连的是:大规模软件如何保持可替换的子系统边界。产品成败另计;设计判断仍然是窄接口与可检查的保护。读他,应带着一张现役系统的接口清单,看哪些已经冻成了无法替换的内部箭头。

1973 年的禁闭短文把保护从矩阵格子推进到通道。服务若必须读取机密才能计算,又必须产生任何对外可观察的结果,就可以把比特编码进时延、合法输出的选择或资源消耗。限制它只能走指定接口,并不能取消这些通道。安全策略若要求“高安全输入不得流向低”必须连定时与配额一起管。后来的信息流控制是把这道题从无法消灭改写成可以度量带宽。禁闭没有被解决,它被标成必须记账的泄漏。操作系统 里的沙箱若只管系统调用表、不管调度与缓存,就是在重复这篇短文已经画出的边界。

兰普森与斯图吉斯 1979 年的崩溃恢复报告把分布式存储的原子性写成两阶段:先投票,再提交或中止。协调者消失时参与者可能阻塞,这不是实现疏忽,而是协议在没有额外共识日志时的活性缺口。后来的三阶段与基于 Paxos 的提交,是在给这道缺口找出口。把那份长期以技术报告流传的文本写成“已经解决分布式事务”,忽略了故障模型。Hints 其实预告了这一点:正常路径与失败路径必须分开设计,不能用同一份乐观代码同时承诺平均最快与最坏可证。

1990 年代与阿巴迪、伯罗斯、尼达姆等人把认证写成“谁说了什么”的逻辑。证书是语句,不是加密装饰。认证回答来源,授权再把语句映射到访问矩阵。把两者捆成一个“登录成功”的布尔值,是真实系统里最常见的接口塌缩。此后每一次请求都不再出示它对应的那一格,最小权限就只写在文档里。云上的角色会话若把一次联合身份变成全库管理员,重复的正是这次塌缩。

人物小记:接口比聪明的实现更贵

兰普森的论文往往很短,句子像在删。他不把系统当成算法竞赛,而当成一组必须在故障后仍可解释的接口。保护矩阵、禁闭、提示与恢复协议,都是在规定实现被允许在哪一层耍聪明。图灵奖表彰的个人计算环境,是这些接口被做进工作站之后的可见结果。

若把轨迹压成一句判据:好的系统贡献,是让后来者无法再把策略、机制与故障恢复写成同一坨代码。 矩阵回答可否,证书回答是谁,协议回答失败后如何一致,提示回答接口怎样才不会在十年后无法修改。聪明可以留在实现里,前提是接口仍能被证明和被撤销。

能力与 ACL 的往返,是同一张访问矩阵的两种投影。能力便于问“这个进程现在能碰什么”,传递容易、撤销难;ACL 便于问“这个文件给了谁”,撤销容易、传递要改名册。主流操作系统把文件描述符做成受限能力,又把 POSIX 权限做成粗 ACL,等于同时使用两种投影而不向用户解释投影关系。云 IAM 把矩阵再展开,复杂来自表达力,不是来自时尚。每隔十年把能力请回微内核或浏览器,是因为某一种投影在新的威胁模型下又不够用。

端到端论证常被误写成“中间层什么都不要做”。兰普森与萨尔策传统真正说的是:正确性的终点在应用语义,中间层的校验不能冒充终点。校验和、重传与加密仍然必要,它们降低的是代价,不是把证明责任下移。系统课若把这一句删成“保持简单”,就会在存储栈里重复造轮子,又在应用里假设磁盘永不撒谎。提示是检查单:你把证明放在哪一层,那一层的失败模式就必须被写下。

个人计算的遗产因此不是鼠标,而是把保护、网络与文档当成日常对象之后,接口必须能活过硬件换代。Alto 的位图与以太网是那一代的具体化。今天的笔记本换网卡而不重写文字处理器,仍在花这笔遗产。图灵奖把分散在许多合作里的判断收成一句:计算机作为日常对象,靠的是可替换的合同,而不是某一实验室的一次性魔术。

1992 年的颁奖文本把工作站、网络、操作系统、编程环境、显示器、安全与文档出版并列,不是因为评委会不会删字。缺任何一项,个人分布式计算都闭不成环。工作站没有网络只是个人计算器;网络没有保护模型只是事故放大器;保护模型没有文档与显示,办公室不会换掉打字机。兰普森的位置是把这些对象接到同一套可检查的接口上,并允许实现在接口背后投机。Hint 不是反形式化:它允许常见路径走可错提示,前提是失败时仍能退回不变量。把提示当成可以不写规格的许可证,是反读。

激光打印与假脱机把“文档”做成可排队的对象:失败必须可重试,权限必须可 revocable,字体与页面描述必须与某一台打印机解耦。这是 Hints 的具体习题,不是外设附录。今天的对象存储把同一习题再做一遍:上传是意图,实现是分片与校验,接口不能把分片布局泄漏成应用合同。兰普森在 PARC 写下的分层,在云上仍然是那张检查单。SDS 940 的分时已经把“看起来属于自己”做成保护问题;工作站只是把这句从分片幻觉改成专用硬件。合同没变:调度、地址空间与设备必须让邻居不可见,除非矩阵允许。云虚拟机重复的是同一句,只是邻居从终端用户换成了租户。

跨域连接

  • 证明:端到端论证是一种关于证明责任的元定理:你若在中间层证明了传输可靠,仍未证明应用语义正确。系统论文里的「保证」必须写明层次。兰普森把这层写进工程师的日常语言,使后来的形式化工作知道规格该停在哪一层。后来 seL4 一类内核把保护做成精化定理,规格停在能力与系统调用;应用语义仍在定理外面。Hints 预先指出了这条停靠站,而不是事后才发现证明有边界。
  • 信息不对称:接口隐藏实现,是故意制造的不对称:调用者不该知道磁盘布局。不对称一旦被绕过(通过未文档化的副作用),系统就无法进化。Hints 要求接口诚实,其实是要求这种不对称稳定、可依赖,而不是靠调用者偷看。Alto 的文件与打印接口若泄漏了以太网帧格式,上层办公软件会冻在某一代网卡上。个人计算能换硬件,依赖的正是这层被遵守的不对称。
  • 国家能力:保护机制是机器内部的行政法:谁有权动哪一份对象。能力是许可证,ACL 是名册。国家能力文献强调文书与强制必须匹配;操作系统同样:权限模型写得很美但每次访问不检查,等于没有法。完整媒介就是强制力:没有一次「抄近道」的读写。云上的 IAM 若允许未记录的管理员后门,行政法就只写在宣传页上。
  • 范畴论:窄接口像对象之间只暴露少量态射。可替换实现像同一接口上的不同函子。这不是兰普森写过范畴论文,它说明:系统能进化,是因为调用者依赖的是态射的合同,不是某个具体对象的内部箭头。接口膨胀,就是把内部箭头公开,函子再也换不掉。Hints 里反对过宽接口,翻译成这一语言就是:不要把对象的内部态射升成公共态射。

参考文献

  • Lampson, B. W. "Hints for Computer System Design." Operating Systems Review 17(5):33–48, 1983; 修订后见 IEEE Software 等转载。
  • Lampson, B. W. "Protection." Proceedings of the 5th Princeton Conference on Information Sciences and Systems, 1971; 重刊 Operating Systems Review 8(1):18–24, 1974.
  • Thacker, C. P., McCreight, E. M., Lampson, B. W., Sproull, R. F. & Boggs, D. R. "Alto: A Personal Computer." 收录于 Siewiorek, Bell & Newell, Computer Structures, 1982.
  • Saltzer, J. H., Reed, D. P. & Clark, D. D. "End-to-End Arguments in System Design." ACM Transactions on Computer Systems 2(4):277–288, 1984.
  • Lampson, B. A Note on the Confinement Problem. Communications of the ACM 16(10), 1973, pp. 613–615.(禁闭与隐蔽通道)
  • Lampson, B. & Sturgis, H. Crash Recovery in a Distributed Data Storage System. Xerox PARC Technical Report, 1979.(两阶段提交的早期完整叙述)
  • Abadi, M., Burrows, M., Lampson, B. & Plotkin, G. A Calculus of Access Control. Journal of the ACM 42(4), 1995, pp. 706–734.(访问控制演算)
  • ACM. 1992 A.M. Turing Award 颁奖词。

延伸阅读

  • Lampson, B. W. 图灵奖讲座与微软研究院公开讲义(系统设计课)。
  • Bardini, C. Bootstrapping. Stanford University Press, 2000. (交互计算前史,作延伸而非本页佐证)