1 历史与背景

1.1 开发起源

1.1.1 MIT的MAC项目

Multics的起源可追溯至麻省理工学院(MIT)的MAC项目(Project on Mathematics and Computation),该项目成立于1963年,由美国国防部高级研究计划局(ARPA)资助。MAC项目的核心目标是探索分时操作系统(Time-Sharing System)的可行性,旨在让多名用户通过终端同时共享一台计算机的计算资源。MIT早前的分时实验系统(CTSS)取得了初步成功,但受限于硬件能力,无法大规模推广。MAC项目因此立项,希望开发一个更强大、更通用、更安全的下一代分时系统,即Multics。

1.1.2 贝尔实验室与通用电气加入

1964年,MIT意识到仅靠自身力量难以完成如此庞大的系统工程,于是邀请贝尔实验室(Bell Laboratories)和通用电气公司(General Electric)加入合作。贝尔实验室派遣了包括Ken Thompson在内的多名研究人员,而通用电气则提供硬件平台支持——其GE 645计算机被选为Multics的首选机器。三方于1965年正式签署合作协议,形成了“MIT-贝尔-通用”联合开发小组。这一组合汇集了学术界的创新思想、工业界的工程经验以及商业公司的硬件资源。

1.2 开发历程

1.2.1 1965年初步设计

1965年,联合小组发布了Multics的初步设计文档,提出了多项革命性概念:分层存储管理、动态链接、环状安全模型等。设计文档长达数百页,被戏称为“紫皮书”(因封面为紫色)。该设计确立了Multics作为“计算实用程序”(Computing Utility)的理念——类似于电力公司或电话公司,用户无需关心底层硬件,只需通过终端即可获得计算服务。这一愿景在当时过于超前,但为后续的分时系统树立了技术标杆。

1.2.2 1969年首次运行

开发过程波折不断。GE 645的硬件设计存在诸多缺陷,导致Multics的首次成功运行推迟到了1969年3月。第一个稳定版本仅支持少数终端,运行速度缓慢。贝尔实验室的团队对Multics的缓慢进展感到失望,尤其是系统的大小和复杂度远超预期。据传,Ken Thompson和Dennis Ritchie在等待Multics编译程序时,因系统太慢而萌生了开发一个更轻量系统的念头——这直接催生了UNIX。

1.2.3 1970年代商业推广

1970年代,通用电气将其计算机部门出售给Honeywell公司,Multics随之转移到Honeywell旗下。Honeywell推出了Honeywell 6180系列硬件,并试图将Multics作为商业产品推广。Multics被安装在多个大学和研究机构,包括麻省理工学院、贝尔实验室(实验部署)、美国空军子系统部等。然而,其高昂的硬件成本(每台机器价格超过100万美元)和复杂的运维要求,限制了其市场渗透。到1970年代末,Multics在全球仅有约80个安装站点。

1.3 项目终止与后续影响

1.3.1 贝尔实验室退出

1969年,贝尔实验室正式从Multics项目中撤出。实验室管理层认为Multics的商业前景渺茫,且开发周期过长。贝尔实验室的退出导致联合开发小组解体,但Honeywell继续独立开发Multics。贝尔实验室的研发人员将Multics经验带回了自己的项目——Ken Thompson开始用汇编语言编写UNIX原型,而Dennis Ritchie则开发了C语言。因此,Multics的退出反而推动了操作系统史上最成功的家族之一——UNIX——的诞生。

1.3.2 最终版本与退役

Honeywell持续维护Multics至1980年代,推出了多个版本(如MR 5.0、MR 7.0)。然而,随着小型机和微型机的崛起,大型分时系统逐渐被边缘化。1985年,Honeywell关闭了Multics的销售渠道。最后一批Multics系统于2000年退役,其中加拿大卡尔顿大学的一套系统运行至2000年10月30日,标志着Multics的正式落幕。

2 核心技术

2.1 内存与存储管理

2.1.1 分页与分段

Multics引入了现代操作系统中常见的内存管理技术:分页(Paging)与分段(Segmentation)的结合。分页将物理内存划分为固定大小的页框,而分段则允许程序按逻辑单元(如代码段、数据段、栈段)组织地址空间。每个段的大小可变,且可以独立地进行分页。这种设计使得Multics能够支持超过物理内存总量的虚拟地址空间,并为进程提供隔离的内存视图。即使在硬件性能有限的1960年代,这一机制也显著提升了系统的健壮性和灵活性。

2.1.2 分层存储架构

Multics实现了一个三级存储层次:高速缓存(CPU寄存器)、主内存(磁芯存储器)和辅存(磁盘)。操作系统自动管理数据在各级存储之间的迁移,对用户完全透明。系统使用“缺页中断”机制将需要的页面从磁盘调入内存,而不需要的页面则被换出。这种分层存储架构是虚拟内存的关键实现,后来被几乎所有现代操作系统所采用。

2.2 并发与进程管理

2.2.1 多道程序设计与分时调度

Multics采用了多道程序设计(Multiprogramming),允许多个进程同时驻留在内存中。调度器使用轮转(Round-Robin)算法,为每个用户进程分配时间片(通常为几十毫秒),并定期切换以模拟同时运行。系统支持多达数百个终端同时登录,每个用户都感觉自己在独占计算机。此外,Multics还引入了优先级调度,允许系统进程和用户进程设定不同的优先级等级。

2.2.2 进程间通信(IPC)

Multics提供了多种进程间通信机制,包括消息传递、信号量共享内存。其中最著名的是“事件通道”(Event Channel)和“陷阱门”(Trap Gate)机制。事件通道允许进程之间异步通知事件发生,而陷阱门则实现了进程间的受控调用(类似于远程过程调用)。这些设计为Multics的模块化服务架构提供了基础,也是现代微内核系统的前驱。

2.3 安全与访问控制

2.3.1 环状安全模型(Ring Model

Multics的安全性设计是其最具影响力的创新之一。它引入了环状安全模型(也被称为“Bell-LaPadula模型”的早期先驱),将系统权限分为多个同心环(Rings)。环0位于最内层,拥有最高权限(内核代码);环1-3用于操作系统服务;环4-7供用户程序和应用程序使用。进程无法从外层环访问内层环的数据,除非通过受控的系统调用。这种分层隔离机制有效防止了用户程序恶意或意外破坏系统核心,为后来的操作系统安全模型(如Intel x86的Ring 0/3模型)提供了基石。

2.3.2 文件系统权限

Multics的文件系统实现了基于用户和组的访问控制。每个文件和目录都关联一个访问控制列表(ACL),详细指定了不同用户或组的读、写、执行权限。安全性被细分为“读取”、“写入”、“执行”、“追加”等多种操作。此外,Multics还引入了“安全级”(Security Level)概念,允许系统管理员为不同用户设定保密等级,从而实施强制访问控制(MAC)。这些设计在1970年代的商用系统中极为罕见,使其被美国军方选用于安全项目。

2.4 编程与系统接口

2.4.1 动态链接库

Multics是现代动态链接的发明者。在传统系统中,程序在编译时将所有库函数硬编码进可执行文件,导致磁盘空间浪费且升级困难。Multics实现了“共享段”(Shared Segments)机制,允许多个进程共享同一份代码段,并在运行时通过符号解析完成链接。程序只需声明依赖的库,系统会在加载时动态解析所需函数。这不仅减少了内存占用,还允许库文件在不重新编译用户程序的情况下更新

2.4.2 Multics命令语言

Multics的命令语言(Command Language)是用户与操作系统交互的主要界面。它曾被视为“shell”的雏形,支持命令别名、键盘宏、后台运行、管道(管道符号为>而非UNIX的`)和重定向。用户可以使用redirections<&gt;`)处理输入输出流,且支持进程的后台与后台恢复。值得注意的是,Multics命令语言还支持一种名为“故事模式”(Story Mode)的交互式风格,允许用户通过自然语言语句(如“Show me the files in my directory”)执行操作——在智能助手普及的今天看来,其设计理念颇具前瞻性。

3 体系结构

3.1 硬件平台

3.1.1 GE 645/635系列

Multics最初的硬件平台是通用电气公司的GE 645计算机。GE 645是GE 635的改进版,专门为Multics添加了分段/分页单元(Segmentation and Paging Unit),能够支持32位的虚拟地址空间(但实际物理地址仅为18位)。该机器使用磁芯内存,主频约1 MHz。由于硬件是为通用科学计算设计的,其指令集和内存保护机制存在诸多限制,导致Multics在早期版本中频繁遇到处理效率问题。

3.1.2 Honeywell 6180兼容机

1970年代,Honeywell收购了通用电气的计算机业务,并推出了Honeywell 6180系列。6180是GE 645的兼容升级品,提供了更好的分时和支持能力,新增了可靠的硬件内存保护功能。Honeywell 6180支持多达16个处理器(多处理机配置),但大多数安装节点只使用1-2个处理器。该系统通过高速总线(水平总线)连接各处理器和I/O控制器,性能较GE 645有显著提升,并在Honeywell的维护下运行至Multics退役。

3.2 内核设计

3.2.1 核心内核与外围服务

Multics的内核设计采用了“微内核”的思想(尽管当时尚未命名)。核心内核仅在环0中运行,负责处理最底层的中断处理、进程调度、内存分页和I/O控制。而文件系统、网络协议、设备驱动等系统服务运行在环1-3中,以用户模式进程的形式执行,但享有比普通用户更高的权限。这种分离设计提高了系统的可靠性:即使文件系统服务崩溃,内核也不会立即崩溃,可以尝试重启服务。

3.2.2 虚拟内存实现

Multics的虚拟内存完全由内核管理。当一个进程请求访问某个地址时,硬件首先检查该地址所在段是否已在内存中。若不在(缺页),内核会触发一个陷阱,调用页面置换算法(基于最近最少使用LRU)选择一个页框,并从磁盘加载缺少的页面。Multics实现了按需分页(Demand Paging),即只有当进程实际访问页面时才加载,而非预先加载所有代码。这一特性显著减少了系统启动时间和内存浪费。

3.3 文件系统

3.3.1 目录树与符号链接

Multics的文件系统采用了层次化的目录树结构,与UNIX相似。根目录为>,路径名以>分隔(例如>用户>alice>文件)。每个文件都有一个唯一的路径名。Multics还支持符号链接(Symbolic Link),这是一种允许文件“指向”其他文件的特殊文件类型。符号链接可以跨文件系统甚至跨机器,为分布式计算提供了基础。这一概念被后来的UNIX和类UNIX系统直接继承。

3.3.2 文件版本控制

Multics的文件系统实现了版本控制功能。每次写文件时,系统会自动创建一个新版本,并保留旧版本(除非删除)。用户可以使用文件名加版本号(如file.3)来访问特定版本。这种机制类似于现代分布式版本控制系统(如Git)的“提交”思想,但自动化和后台执行。用户也可以手动删除中间版本以节省空间。尽管限制了保存的最大版本数(通常为32个),但这一设计在当时极为超前,是数据恢复和审计的重要工具。

4 影响与遗产

4.1 对UNIX的影响

4.1.1 Ken Thompson与Multics经验

Ken Thompson在贝尔实验室参与Multics开发期间,亲身经历了大型操作系统开发的复杂性。Multics的庞大和缓慢给了他深刻教训:在等待Multics编译器编译一个程序时,他曾在走廊里玩骰子。这段经历促使他决定开发一个更小、更快的分时系统——UNIX。UNIX的设计哲学“KISS”原则(Keep It Simple, Stupid)可以视为对Multics过度复杂化的一种反叛,但UNIX的许多核心概念仍来自Multics。

4.1.2 UNIX中的Multics概念继承

尽管UNIX在规模上刻意精简,但它继承了大量Multics的关键思想:

  • 分层文件系统:UNIX借鉴了Multics的目录树结构(以斜杠/代替>)。
  • Shell:UNIX shell(由Stephen Bourne开发)直接沿用了Multics命令语言的设计理念。
  • 权限模型:UNIX的读/写/执行三位权限,本质上是Multics环状权限的一种简化。
  • 进程管理:UNIX的fork/exec进程创建模型,与Multics的进程派生机制一脉相承。
- 管道:虽然UNIX的管道符号``是Dennis Ritchie的发明,但Multics的重定向和进程间通信为这一概念提供了土壤。

4.2 对现代操作系统的启发

4.2.1 安全模型与沙盒机制

Multics的环状安全模型是现代操作系统沙盒机制的先驱。当今的Android Apps沙盒、iOS容器、Linux Namespaces和Windows Integrity Levels,都可以追溯到Multics的权限隔离思想。研究人员经常引用Multics的安全设计,作为构建更高安全级操作系统的参考。特别是,Google的Fuchsia OS实验项目曾提到Multics在系统服务节化方面的贡献。

4.2.2 动态链接与共享库

Multics的动态链接库是现代操作系统中共享库的雏形。今天,Linux的.so文件、Windows的DLL,以及macOS的.dylib都基于类似概念。动态链接不仅节省了磁盘和内存空间,还允许应用程序通过更新库文件来修复安全漏洞或添加功能,而无需重新编译。这一机制在维护大型软件生态系统中至关重要。

4.3 文化与社会影响

4.3.1 计算机科学教育与研究

Multics是许多计算机科学课程的经典案例。它常被用作“技术创新但商业失败的教训”的课堂讨论材料。MIT、斯坦福等高校至今仍在操作系统课程中讲授Multics的分段分页机制、环状安全模型和分层存储设计。此外,Multics开发的详细历史帮助研究者理解大型系统工程的挑战与机遇。

4.3.2 用户社区与趣闻

Multics的用户社区虽然小众,但充满传奇色彩。贝尔实验室的早期用户曾讲述过一个趣闻:为了提醒Multics的缓慢,系统管理员创建了一个名为“SLOW”的脚本,每次用户执行该脚本时,它都会打印一段笑话后才运行命令。另一个著名故事是“Multics的bug”:1974年,一名用户无意间发现了一个能让系统崩溃的命令序列,据说该bug源于一个未初始化的内存段。这些趣闻在计算机文化中口口相传,成为分时系统时代的独特记忆。

5 相关系统与变体

5.1 衍生系统

5.1.1 PrimeOS

PrimeOS是通用电气在1970年代开发的另一个分时操作系统,与Multics共享部分代码基础。PrimeOS主要运行在通用电气的Prime系列迷你计算机上。虽然PrimeOS未像Multics那样引入那么多创新,但它证明了分时系统在中小型机上的可行性。

5.1.2 其他分时系统

Multics同时代的分时系统还包括:IBM的TSS/360(与Multics同期却更短命)、MIT的CTSS(Multics的直接前身)、以及Dartmouth的DTSS。这些系统共同推动了分时技术的进步,但只有UNIX最终实现广泛普及。

5.2 现代重实现

5.2.1 Multics仿真器与开源项目

尽管Multics已退役,但它的遗产通过仿真器得以延续。最著名的项目是Multics Simulator(由Paul Kline等人开发),它能模拟Honeywell 6180硬件,允许现代用户在PC上运行原始Multics系统。此外,开源爱好者还写了一个名为DPS8M的仿真器和一组Multics用户空间库,可运行部分Multics命令。这些项目体现了计算机历史爱好者的执着:如果你想看看“如果UNIX没被开发出来,计算机世界会是什么样子”,运行一个Multics仿真器是最直接的途径。

6 参考文献与扩展阅读

6.1 原始论文与手册

  • Corbato, F. J., &amp; Saltzer, J. H. (1969). *Multics: The First Seven Years*. MIT Project MAC Technical Report.
  • Organick, E. I. (1972). *The Multics System: An Examination of Its Structure*. MIT Press.

6.2 技术书籍与回忆录

  • Ritchie, D. M. (1976). *The Evolution of the UNIX Time-sharing System*. Bell Labs Technical Journal.
  • Salus, P. H. (1994). *A Quarter Century of UNIX*. Addison-Wesley. (含Multics与UNIX关系章节)

6.3 在线资源与档案

  • Multics网站(multicians.org):由Multics爱好者维护的最全面非官方档案库,包含文档、照片和用户回忆。
  • MIT计算机博物馆(museum.mit.edu):保存了原始Multics硬件和软件资料。
  • DPS8M项目(dps8m.org):开源的Multics仿真器项目,提供下载和运行指导。