8 月 22 日,一篇题为 Learning about "The Unix Time-Sharing System" 的长文出现在 Hacker News 上。热度并不高,十几分、几条评论,但选题本身很说明问题:有人愿意为一份五十年前的操作系统论文写逐节精读,而且标题用的是 "learning about"——学习,不是怀旧。
这里的「UNIX 论文」,指贝尔实验室的 Ken Thompson 与 Dennis Ritchie 于 1974 年 7 月发表在《Communications of the ACM》上的《The UNIX Time-Sharing System》。彼时系统已在 PDP 系列机器上运行了约五年,这篇论文是它第一次面向外界的完整自我陈述。今天 Linux、macOS、各类容器与嵌入式环境里那些被当作空气的设计,多半能在这二十多页纸里找到出处。
论文到底讲了什么
按论文自身的结构,重点大致有四块。
其一是文件系统,也是全文戏份最重的部分:分层目录、i-node、权限位、可挂载的卷,以及把设备当作特殊文件处理。论文反复强调的一点是,所有 I/O 被统一成「打开、读写、关闭」这组动作,磁盘、打印机、终端在这个抽象之下没有本质区别。
其二是进程模型。 fork 与 exec 分离、wait 与 exit 配对,这套语义至今未变。值得注意的是,shell 在论文里并没有被抬举为「系统的一部分」,它只是一个普通程序:I/O 重定向、管道、后台任务,都是普通进程能力之上的一层薄壳。内核只提供机制、把策略留给用户态,这种姿态是 UNIX 得以演化五十年的关键。
其三是实现。 系统绝大部分用 C 写成,汇编只占很小的角落。这个决定在当时是冒险,后来成了可移植性的伏笔——没有它,就没有 UNIX 从 PDP-11 向各型机器的迁徙,也未必有后来的 Linux。
其四是态度。 论文没有把 UNIX 包装成面向某类应用的解决方案,而是将其定位为程序员手中的通用工具;结尾甚至坦承系统还缺少真正的进程间通信与数据共享机制,网络问题也远未解决。把「没做完的事」写进论文,这种诚实今天读来依然稀缺。
五十年后仍值得读它的三个理由
第一,它是现代系统术语的词源表。 inode、挂载、特殊文件、管道、后台进程——读懂论文,等于读懂 man 手册里这些词为什么长成这样。教学价值至今没有折旧。
第二,它是「机制优先于策略」的完整示范。 设备即文件,后来延伸出 /proc、Plan 9 乃至「一切皆文件」的极端化实验;shell 可替换、工具可组合,「一次做好一件事」的组合式哲学,从命令行管道一路延续到今天的容器镜像与 CI 脚本。PowerShell 用对象管道替代字节流,恰好从反面证明了这套设计影响之深。
第三,它是一份克制的样本。 论文所描述的内核职责清单极短。对照今天动辄数千万行代码的通用操作系统,能直观看到复杂度是如何一层层加上去的——其中哪些是时代使然,哪些只是路径依赖,值得每个做系统的人自行分辨。
简短点评
好的文档是系统设计的另一半。这篇论文之所以成为经典,一半因为系统本身出色,另一半是因为它讲得清楚、克制、诚实。Dennis Ritchie 后来写过回顾《The Evolution of the Unix Time-sharing System》,交代论文之外真实的决策过程,两篇对照着读,比多数教科书更能说明「操作系统」三个字的分量。与其在网上争论 UNIX 哲学是否过时,不如先花一个下午把原文读完——它比绝大多数相关的争论都要短。