什么是Unix

在今天的云计算课里,我们习惯把服务器当作“理所当然的背景布”。可如果把时针拨回到 1960 年代,计算机是一台台塞满机房、昂贵到需要共享的 大型机(Mainframe)。每个人坐在自己的 终端机(Terminal) 前打字,终端不做计算,只把你的请求送到主机,再把结果输回来。那是一个“一颗大脑,许多双手”的世界:所有算力都在主机里,几十上百个终端通过串口或电话线连着它,人们轮流“切片”使用 CPU,这叫 分时(time-sharing)

            [ Mainframe ]            
            /     |      \        
            TTY1    TTY2    TTY3 ...  (Teletypewriters,终端机,只负责输入/输出)

在这个背景下,Unix 诞生了。

- TTY = Teletypewriter(电传打字机)的缩写。最早(20 世纪 50–60 年代),人们用这种打字机式终端和大型机交互:你敲键盘 → 机械打字机把字打在纸上;机器返回结果 → 同样打在纸上。这种设备原本是电信行业的产物(用来通过电报线传文字),后来接入了计算机系统。


Multics:宏愿太大,落地太难

1964 年,MIT、GE 与贝尔实验室合作了一个雄心勃勃的项目 Multics(Multiplexed Information and Computing Service),愿景近似今天的“云服务”:让计算像自来水与电力一样随取随用。它追求几乎“一切都要有”的完备特性:细粒度安全、在线升级、模块化、弹性扩展、强隔离的多用户、多任务。

问题是,太复杂。在当时的软硬件条件下,这艘巨舰很难稳稳开动。1969 年,贝尔实验室退出了项目。


Unix:从“够用就好”的反叛开始

退出 Multics 的工程师们——Ken ThompsonDennis Ritchie (C语言之父)等——并不想放弃多用户系统的理想,只是换了条路:做小、做简、做优雅。Ken 在一台废弃的 PDP-7 上用汇编写出了一个小系统,朋友半开玩笑地把它称为 Unics(意指比 Multics “单一/简洁”),后来写作 Unix。不久,Dennis 用他们发明的 C 语言重写了 Unix——这一步让它可移植、可演进,成为现代操作系统史上的分水岭。

Unix 的成功并不靠“包罗万象”,而是靠三条朴素而锋利的哲学:

  • 一切皆文件:磁盘文件、目录、设备、甚至网络连接,都用统一的“文件”接口(interface)来访问。
  • 小而专一的工具:每个命令只干一件事,但做到极致。
  • 可组合性(管道):用 | 把小工具串起来,像搭乐高一样构建复杂能力。

这套思路与大型机 + 终端的时代天然适配:很多人并发登录、在各自的 shell 中运行一串小工具,主机负责调度与隔离,终端只显示结果。


接口

在计算机里,接口 (interface) 就是一个 统一的约定/规则,它定义了:

  • 我能对某个对象做哪些操作?
  • 这些操作会返回什么结果?

举例:

  • 插座就是一个接口:无论是灯、电脑、充电器,只要符合插头标准,都能插进去取电。
  • 手机的 USB-C 口也是接口:无论是数据线还是耳机,只要符合 USB-C 协议,都能用。

好处:统一性。用户和程序不需要关心背后设备的复杂细节。

Unix 规定:

  • 不管是硬盘上的普通文件 (/home/user/a.txt)
  • 还是目录 (/home/user/)
  • 还是键盘/显示器这样的终端 (/dev/tty)
  • 还是打印机 (/dev/lp0)
  • 甚至是网络套接字 (/dev/tcp/…)

它们在系统里都表现为“文件”,并且都遵循相同的接口:

  • open(打开)
  • read(读)
  • write(写)
  • close(关闭)

unix为什么赢

Multics:过于庞大和前瞻

Multics 的目标听起来像今天的云计算:

  • 无限扩展:用户数和程序数理论上不受限
  • 极高安全性:多级权限、严格隔离
  • 模块化和弹性:组件可以随时在线替换、升级
  • 分时系统:每个用户都像独占计算机一样

这在 1960 年代是超前的梦想,但现实是:

  • 硬件不够强:当时的 CPU 和内存资源有限,无法支撑复杂的特性。
  • 软件复杂度过高:架构臃肿,代码庞大,导致 bug 多、难以调试。
  • 开发效率低:目标太大,始终“造不完”,用户体验差。

结果是:Multics 概念先进但落地失败,就像给 60 年代的汽车工厂下单“造一辆特斯拉”,现实条件根本撑不起。

Unix:小而美,快速落地

Unix 的哲学正好反过来:

  • 不追求“大而全”,只追求“小而能用”。
  • 把复杂的目标拆解成简单的接口和工具
  • 一开始就能在小型机上跑起来,能给研究人员立刻用。

Unix 的成功关键:

  1. KISS 原则(Keep It Simple, Stupid):每个工具小而专一。
  2. 组合性:通过管道把工具拼起来,复杂功能也能实现。
  3. C 语言重写:操作系统第一次实现了跨硬件移植,能从 PDP-7 移到 PDP-11,再移到更多机器。
  4. 开源传播:AT&T 法律限制它不能卖钱,只能几乎免费授权给大学。伯克利等高校接手改进,社区力量滚雪球式壮大。

Unix 不是更强的武器,而是更实用的工具箱

Multics 最终确实启发了很多概念(安全模型、分时思想),但作为产品失败。Unix 借助简洁设计和传播优势,逐渐成为学术界和工业界的标准。Linux、macOS、Android 都是 Unix 衍生或受其启发的产物。而 Multics,只留在历史教材里。


为什么 Unix 能“飞起来”

在 1970 年代,AT&T 出于监管约束,不能把 Unix当作商业产品销售,于是以很低的门槛授权给高校。加州大学伯克利在此基础上孵化出 BSD 系列(许多网络栈创新——TCP/IP、sockets——都诞生在这里),而商业世界也演化出 System V。后来,人们用 POSIX 标准把这些分支的接口尽量对齐,让“像 Unix 的系统”能共享一套开发习惯。

1991 年,Linus Torvalds 受 Unix 启发写出了 Linux 内核,搭配 GNU 用户空间工具,形成了我们今天所说的 Linux 发行版(Ubuntu、Debian、Fedora、Kali……)。另一边,Apple 以 BSD 为基底打造了 macOS(Darwin/XNU 内核)。再后来,Android 把 Linux 内核带进了每个人的口袋。

如果画一张家谱,大致是:
Unix → { BSD → macOS, System V, Linux → Android }


Mainframe 与 Unix:相互成就的“分时世界”

主机昂贵而稀缺,多人共享是常态;因此你需要一个操作系统来分时调度资源隔离权限管理,并为每位用户提供一致的交互界面——这就是 shell(命令解释器)。早年的 sh、后来的 bash、再到 zsh,本质上都是“人类语言 ↔ 系统调用”的翻译官。用户在终端里敲命令,主机在后台分配时间片运行程序,结果再回到你的屏幕上。这种模型在今天并未过时:你 ssh 登入云服务器的那一刻,其实就在重演半个世纪前的场景。


一段命令行,走完 Unix 的哲学

想象你要从一份 Web 访问日志里找出最常返回 500 的 URL:

cat access.log \ | grep " 500 " \ | awk '{print $7}' \ | sort \ | uniq -c \ | sort -nr \ | head

这不是一个“巨无霸程序”,而是一串小工具在管道里传递文本:筛选、提取、排序、计数、再排序、取前 N。它的威力来自组合,而组合的底层支撑,正是“一切皆文件”的统一抽象。


为什么今天仍然离不开 Unix

把镜头拉回 2025 年:
你的容器编排(Kubernetes)、CI/CD 流水线、云上虚机与无服务器环境,绝大多数运行在类 Unix 的语义上;你的开发工具链(Git、OpenSSH、grep/awk/sed、多语言编译器)遵循的也是 POSIX/Unix 的接口;就连 Windows,也通过 WSL 主动兼容这套生态。原因很简单:小而专一、可组合、可移植 的设计,使它在复杂系统工程里具有极高的工程效率和演化韧性。


从机房到云端,理念未变

从一台主机和一排终端,到全球数据中心与边缘节点,硬件形态翻新了无数代,但 Unix 留给我们的三件法宝——统一抽象、工具颗粒度、管道式组合——始终有效。它们让人类工程师得以在复杂度面前,依旧写出可理解、可维护、可迁移的系统。

当你在云端的 shell 里按下回车,屏幕上一行行字符流动时,半个世纪前那个“一颗大脑,许多双手”的世界,仍在悄悄运转。

Last modified on 2025-09-02 • Suggest an edit of this page
← Prev: Web3和反制冬眠法
Next: 什么是Linux →