Unix 设计哲学教程 / 第 1 章:Unix 的诞生与传奇
第 1 章:Unix 的诞生与传奇
“We wanted to build a system that was not just a good operating system, but one that people would enjoy using.” — Ken Thompson
Unix 的故事,是计算机科学史上最精彩的篇章之一。它起源于一个被取消的项目、一台闲置的小型机、一个太空游戏,最终改变了一个时代。
1.1 前 Unix 时代:Multics 的教训
要理解 Unix,必须先了解 Multics。
Multics 项目(1964-1969)
1964 年,MIT、通用电气(GE)和贝尔实验室(Bell Labs)联合发起了 Multics(Multiplexed Information and Computing Service)项目,目标是打造一个革命性的分时操作系统。
| 特性 | Multics 的目标 |
|---|---|
| 多用户 | 支持数百个用户同时使用 |
| 安全性 | 硬件级别的内存保护 |
| 可扩展 | 模块化内核设计 |
| 持久存储 | 统一的文件系统与虚拟内存 |
然而,Multics 陷入了"第二系统效应"(Second System Effect)——试图把所有好的想法都塞进一个系统中,导致项目过于复杂、进度严重滞后。
1969 年,贝尔实验室从 Multics 项目中撤出。但这段经历给 Ken Thompson 和 Dennis Ritchie 留下了深刻的烙印:
Multics 教会了我们什么该做,更重要的是,什么不该做。
关键教训
| Multics 的问题 | Unix 的回应 |
|---|---|
| 过度设计 | 极简主义:做一件事,做好它 |
| 紧耦合 | 模块化:小工具 + 管道组合 |
| 特定硬件绑定 | 可移植性:用 C 语言重写 |
| 复杂的命令语法 | 简洁的命令接口 |
1.2 Unix 的诞生(1969)
PDP-7 上的太空游戏
1969 年夏天,Ken Thompson 在一台闲置的 PDP-7 小型机上开始了一个"非官方"项目。最初的目的很朴素——他想在新机器上运行自己写的太空旅行游戏《Space Travel》。
PDP-7 规格(1965年发布)
├── CPU: 18-bit
├── 内存: 8K × 18-bit words(约 18KB)
├── 存储: 磁鼓存储器(Drum Storage)
├── 交互: 电传打字机(Teletype)
└── 价格: 约 $72,000(相当于 2026 年的 $600,000)
Thompson 需要一个操作系统来运行这个游戏。于是他和 Ritchie、Rudd Canaday 等人一起,在几周内写出了一套文件系统和一个简单的操作系统内核。
“Uniplexed Information and Computing Service”
Unix 这个名字是贝尔实验室的成员 Brian Kernighan 起的一个双关语:
- Multics = Multiplexed Information and Computing Service(庞大、复杂)
- Unix = Uniplexed Information and Computing Service(简洁、专注)
从 Multi 到 Uni,不仅是字母的减少,更是设计哲学的根本转变。
早期发展时间线
1969 Ken Thompson 在 PDP-7 上编写 Unix 原型
1970 Unix 被正式命名;移植到 PDP-11/20
1971 第一版 Unix Programmer's Manual 发布
1972 管道(pipe)机制被发明
1973 Unix 用 C 语言重写(第四版)
1974 Thompson & Ritchie 在 ACM 发表论文,Unix 开始传播
1975 第六版 Unix 在大学中广泛分发
1977 Unix 移植到非 PDP 机器(Interdata 8/32)
1979 第七版 Unix —— "最后一个真正的 Unix"
1.3 C 语言与 Unix 的共生
为什么用 C 重写?
Unix 最初是用 PDP-7 汇编语言 编写的。1973 年,Dennis Ritchie 和 Ken Thompson 做出了一个改变历史的决定——用他们自己发明的 C 语言 重写整个操作系统。
这个决定的深远影响:
| 维度 | 影响 |
|---|---|
| 可移植性 | Unix 可以在不同硬件架构上编译运行 |
| 开发效率 | 高级语言比汇编更易读、易维护 |
| 生态系统 | C 语言因此成为系统编程的事实标准 |
| 文化影响 | “用你自己的工具构建自己的工具” |
C 语言的设计特点
/* Unix 哲学在 C 语言中的体现 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
/*
* C 语言对 Unix 设计哲学的影响:
* 1. 简洁 —— 没有隐式行为
* 2. 可移植 —— 抽象硬件差异
* 3. 高效 —— 接近硬件性能
* 4. 组合 —— 函数即工具
*/
int main() {
/* 一切皆文件:即使是标准输出 */
write(STDOUT_FILENO, "Hello, Unix!\n", 13);
/* 程序通过退出码(exit code)通信 */
return 0;
}
# 编译并运行
gcc -o hello hello.c
./hello
# 输出: Hello, Unix!
echo $?
# 输出: 0(表示成功)
1.4 Unix 的分裂与标准化
商业化浪潮
1980 年代,Unix 从学术走向商业,引发了激烈的"Unix 战争":
AT&T Unix (System V)
│
┌───────────────┼───────────────┐
│ │ │
SunOS/Solaris HP-UX AIX (IBM)
│
BSD (Berkeley)
│
┌───────┼───────┐
│ │ │
4.2BSD 4.3BSD 4.4BSD
│
├── FreeBSD(1993)
├── NetBSD(1993)
└── OpenBSD(1995)
各主要变体对比
| 变体 | 发行方 | 主要平台 | 特色 | 现状 |
|---|---|---|---|---|
| System V | AT&T | 多平台 | 商业标准 | 已停止 |
| BSD | UC Berkeley | 多平台 | 学术研究 | FreeBSD/NetBSD/OpenBSD 存续 |
| SunOS/Solaris | Sun Microsystems | SPARC/x86 | ZFS、DTrace | Oracle 维护 |
| HP-UX | HP | PA-RISC/Itanium | 企业级 | 仅维护模式 |
| AIX | IBM | POWER | 大型机 | 仍在企业市场 |
| macOS | Apple | ARM/x86 | 桌面体验 | 活跃开发 |
POSIX 标准(1988)
为了结束分裂,IEEE 制定了 POSIX(Portable Operating System Interface)标准:
POSIX 标准层级
├── POSIX.1 — 系统接口(C API)
├── POSIX.2 — Shell 和工具
├── POSIX.1b — 实时扩展
├── POSIX.1c — 线程(pthreads)
└── POSIX.1-2017 — 最新合并版(IEEE Std 1003.1-2017)
POSIX 的意义:让"写一次,到处编译运行"成为可能,是 Unix 可移植性哲学的制度保障。
1.5 BSD 与法律之争
USL v. BSDi(1992-1994)
1992 年,Unix 系统实验室(USL,AT&T 的子公司)起诉 Berkeley Software Design(BSDi),声称 BSD 代码侵犯了 AT&T 的 Unix 版权。
这场官司对 Unix 生态产生了深远影响:
诉讼影响
├── BSD 开发停滞约 2 年
├── Linux 趁势崛起(1991 年诞生)
├── 1994 年和解后 BSD 分裂为三个项目
│ ├── FreeBSD —— 桌面和服务器
│ ├── NetBSD —— 极致可移植性
│ └── OpenBSD —— 安全至上
└── 教训:代码清晰的版权归属至关重要
1.6 Linux:Unix 的精神继承者
Linus Torvalds 的项目(1991)
1991 年 8 月 25 日,芬兰赫尔辛基大学的学生 Linus Torvalds 在 comp.os.minix 新闻组发布了一条消息:
From: [email protected] (Linus Benedict Torvalds)
Newsgroups: comp.os.minix
Subject: What would you like to see most in minix?
Date: 25 Aug 91 20:57:08 GMT
Hello everybody out there using minix -
I'm doing a (free) operating system (just a hobby, won't be big and
professional like gnu) for 386(486) AT clones...
Linux 与 Unix 的关系
| 维度 | 说明 |
|---|---|
| 代码层面 | Linux 是独立编写的,不包含 Unix 源代码 |
| 接口层面 | 遵循 POSIX 标准,兼容 Unix API |
| 设计哲学 | 完全继承 Unix 的模块化、文本流、组合性等原则 |
| 许可证 | GPL 开源,与 Unix 的商业授权截然不同 |
| 社区 | 全球协作开发,最大的开源项目之一 |
Linux 发行版生态
Linux 发行版谱系
├── Debian 系
│ ├── Ubuntu
│ ├── Linux Mint
│ └── Kali Linux
├── Red Hat 系
│ ├── Fedora
│ ├── CentOS(→ Rocky Linux / AlmaLinux)
│ └── RHEL
├── SUSE 系
│ ├── openSUSE
│ └── SLES
├── Arch 系
│ ├── Arch Linux
│ └── Manjaro
└── 独立
├── Gentoo
├── Alpine Linux(容器首选)
└── NixOS(声明式管理)
1.7 macOS:Unix 的华丽转身
从 NeXTSTEP 到 macOS
macOS 的 Unix 血统出人意料地深厚:
时间线
1985 Steve Jobs 离开 Apple,创立 NeXT
1989 NeXTSTEP 发布(基于 Mach 微内核 + BSD)
1997 Apple 收购 NeXT
2001 Mac OS X 发布(Darwin 内核 = Mach + BSD)
2012 更名为 OS X
2016 更名为 macOS
2020 macOS Big Sur 移植到 Apple Silicon (ARM)
macOS 的 Unix 层
# macOS 底层是 Darwin,一个完整的 Unix 系统
uname -a
# Darwin hostname 23.4.0 Darwin Kernel Version 23.4.0 ...
# 验证 POSIX 兼容性
getconf POSIX_VERSION
# 200112
# macOS 的 Unix 工具链
which bash # /bin/bash
which grep # /usr/bin/grep
which sed # /usr/bin/sed(注意:是 BSD sed,不是 GNU sed)
# 查看 Mach 微内核 + BSD 层
sysctl -a | grep machdep
注意:macOS 的命令行工具是 BSD 版本,与 Linux 上的 GNU 版本有细微差异。例如
sed -i的语法不同、ps的选项不同。这是跨平台脚本开发中常见的坑。
1.8 Unix 家族的现代图谱
Ken & Ritchie (1969)
│
┌─────────┴─────────┐
Unix V7 BSD (1977)
│ │
┌─────┴─────┐ ┌────┴────┐
System V 商业BSD 4.4BSD FreeBSD
│ │
┌─────┼─────┐ ┌────┼────┐
Solaris AIX HP-UX NetBSD OpenBSD macOS
(Darwin)
│ │
┌────┴────┐ ┌────┴────┐
illumos SmartOS iOS watchOS
2026 年的 Unix 世界
| 系统 | 市场定位 | 内核 | 许可证 |
|---|---|---|---|
| Linux | 服务器、云、嵌入式、桌面 | Linux kernel | GPL v2 |
| macOS | 桌面、创意工作站 | XNU (Mach+BSD) | APSL |
| FreeBSD | 服务器、网络设备、存储 | FreeBSD kernel | BSD |
| Android | 移动设备 | Linux kernel | Apache/GPL |
| AIX | 企业大型机 | IBM 专属 | 商业 |
| illumos | 云计算基础设施 | illumos kernel | CDDL |
1.9 为什么今天还要学 Unix 设计哲学?
数据说话
全球服务器操作系统市场份额(2025年估算)
├── Linux: ~78%
├── Windows: ~15%
├── FreeBSD/其他: ~3%
└── 未识别: ~4%
全球超级计算机 Top 500(2025年)
└── 100% 运行 Linux
全球智能手机操作系统(2025年)
├── Android (Linux): ~72%
└── iOS (Darwin): ~27%
全球超过 99% 的计算设备运行着某种 Unix 衍生系统。
对开发者的意义
Unix 设计思维在现代开发中的体现
├── Docker/容器 → 一切皆文件 + 进程隔离
├── Kubernetes → 声明式配置 + 组合性
├── 微服务 → 做一件事做好它
├── REST API → 文本流(JSON 替代了纯文本)
├── Git → 简单数据结构 + 小工具组合
├── Node.js → 流(Stream)即 Unix 管道的编程版
└── DevOps → Shell 脚本 + 自动化
1.10 动手实验:探索你的 Unix 系统
# 1. 查看系统信息
uname -a # 内核信息
cat /etc/os-release # 发行版信息
whoami # 当前用户
hostname # 主机名
# 2. 探索文件系统层次
ls / # 根目录
ls -la /bin # 基本命令
ls -la /usr/bin | head -20 # 用户命令(前20个)
# 3. 查看进程树
ps aux | head -20 # 所有进程
pstree # 进程树(需安装)
# 4. 查看系统调用
strace ls 2>&1 | head -20 # Linux
dtruss ls 2>&1 | head -20 # macOS
# 5. 验证 "一切皆文件"
ls -la /dev/sda # 磁盘设备是文件
ls -la /proc/1/cmdline # 进程信息是文件
ls -la /sys/class/net/ # 网络设备是文件
注意事项
- Unix ≠ Linux:严格来说,Linux 只是一个内核,不是一个 Unix 系统。但 Linux 完全继承了 Unix 的设计哲学和 API 接口。
- macOS 是认证的 Unix:macOS(Darwin)是通过 The Open Group 认证的 UNIX® 系统,而 Linux 只是"类 Unix"(Unix-like)。
- 历史版本号:Unix 的"版本号"(V6、V7)与现在常见的语义版本完全不同,指的是内部开发迭代次数。
- 不要混淆 POSIX 和 Single UNIX Specification:POSIX 是 IEEE 标准,SUS(Single UNIX Specification)是 The Open Group 的标准,两者内容大量重叠但不完全相同。
扩展阅读
- The Creation of the UNIX Operating System — Bell Labs 官方历史
- A Quarter Century of Unix — Peter Salus
- The Cathedral and the Bazaar — Eric Raymond
- Linus’s original announcement — 原始新闻组帖子
- Open Group UNIX Certification
- Linux Kernel Timeline