1.2 1960年代 MULTICS 與 UNIX(1969)的分岔革命#
分時(Time-Sharing):讓一台電腦服務許多人#
1950年代末的批次系統有一個致命的體驗缺陷:程式師把整疊卡片交出去,可能要等好幾個小時才拿回結果,而結果可能只是漏了一個逗號。電腦昂貴所以要「榨乾 CPU」,但人的生產力同樣昂貴。這個矛盾催生了分時系統(time-sharing)的想法:讓多個使用者透過各自的終端機「同時」使用電腦,OS 極快地在使用者之間輪轉 CPU,因為人在思考與打字時 CPU 正好可以服務別人——以人為緩衝,化解 I/O 與 CPU 的不匹配。
里程碑包括:
- CTSS(MIT,1961,Fernando Corbató 領導):第一個展示給大量使用者的分時系統,用一個簡單的輪轉排班器與磁鼓交換(swap)使用者行程。
- Dartmouth Time-Sharing System, DTSS(1964):讓 BASIC 語言與分時結合,普及了「互動式程式設計」文化。
MULTICS(1964–1969):宏偉的野心#
MULTICS(Multiplexed Information and Computing Service)是 MIT、奇異公司(GE)與貝爾實驗室的合作計畫(1964 年啟動,目標平台為 GE-645),堪稱作業系統史上最雄心勃勃的工程。它幾乎一次到位地納入了當代所有先進概念:
- 單一樹狀檔案系統:所有檔案(包括裝置、目錄)掛在同一棵樹上,目錄可以像檔案一樣被掛載——今日 Linux 的
/與mount直接繼承於此。 - 分段+分頁的虛擬記憶體:每個行程擁有龐大(當時想像 2^18 段)的位址空間,段提供邏輯保護、頁提供實作機制。
- 動態連結:副程式在第一次呼叫時才連結進來。
- 以高階語言(PL/I)撰寫 OS:當時普遍認為 OS 必須用組語,MULTICS 證明了高階語言可行。
- 環形保護(protection rings):8 個特權環,第 0 環最特權——Intel x86 的 ring 0/3 即源於此。
然而 MULTICS 追求「電腦公用事業(computer utility)」般的完美,工程不斷膨脹:程式碼巨大、GE-645 效能不彰、開發時程屢屢延後。貝爾實驗室在 1969 年退出計畫。
UNIX(1969):極簡主義的分岔#
誕生故事#
MULTICS 退出後,貝爾實驗室的 Ken Thompson 手邊只剩一台閒置、效能低落的 DEC PDP-7,但他仍想繼續玩在 MULTICS 上寫的太空旅行(Space Travel)遊戲。1969 年夏天(妻子休假帶小孩回娘家的一個月),Thompson 在 PDP-7 上用組語寫出了小型 OS 的核心:檔案系統、行程機制、shell 與一組小工具。貝爾實驗室的同事 Brian Kernighan 開玩笑地把這個「閹割版 MULTICS」命名為 UNICS(UNiplexed Information and Computing Service),後來拼成 UNIX。
1971 年,Thompson 與 Dennis Ritchie 把 UNIX 移植到 PDP-11,並為專利部門的文字處理需求找到第一個實際用途。1973 年,Ritchie 以他自己為此目的設計的 C 語言重寫 UNIX 核心——這是劃時代的一步:OS 首次變成可攜的。1974 年 Ritchie 與 Thompson 在 CACM 發表〈The UNIX Time-Sharing System〉,UNIX 從此傳遍學術界(貝爾實驗室受反壟斷判決限制不能賣軟體,於是以象徵性費用附原始碼授權大學,意外造就了開放文化)。
UNIX 哲學:與 MULTICS 的對照#
UNIX 的成功並非因為功能比 MULTICS 多,而是因為取捨截然不同:
| 面向 | MULTICS | UNIX |
|---|---|---|
| 設計哲學 | 宏偉、功能完備 | 極簡、能做就好 |
| 位址空間 | 段+頁 | 平坦分頁(後繼 BSD 才加回虛擬記憶體) |
| 檔案系統 | 龐大、支援複雜存取控制 | 簡單 inode、樹狀結構 |
| 程式介面 | 大而全的系統呼叫 | 小而正交:open/read/write/close 一體適用於檔案、裝置、pipe |
| 複用機制 | 內建複雜功能 | 組合小工具:cat | grep | wc |
「一切皆檔案」與「小程式透過 pipe 組合」,使 shell 成為一種可程式化的組合語言——從編譯器角度,UNIX shell 是第一個真正普及的腳本語言;而 pipe 則把「生產者—消費者」的同步抽象包裝成了語法符號 |。
分岔:BSD、System V 與開源#
- 1970年代末,Berkeley 的 Bill Joy 等人發展出 BSD(Berkeley Software Distribution),加入 vi、C shell、TCP/IP(1983 年 4.2BSD,使 UNIX 成為網際網路的母語)與虛擬記憶體(3BSD,DARPA 資助)。
- AT&T 於 1983 年(反壟斷判決生效、貝爾解體後)推出商業版 System V。
- 1980年代的「UNIX 戰爭」(BSD vs. System V,及後來的 OSF/1 vs. Unix International)反而促進標準化:POSIX(1988)誕生,定義可攜的系統呼叫介面。
- 1987 年 Andrew Tanenbaum 為教學寫出 MINIX;1991 年 Linus Torvalds 以 MINIX 為起點寫出 Linux 核心,與自由軟體基金會的 GNU 工具鏈(gcc 等)合流,成為今日統治伺服器、手機(Android)與超級電腦的系統。歷史在此完成一個閉環:UNIX 的血統經由教學與開源,繁殖出了整個現代運算世界。
為什麼「分岔」是關鍵詞#
本節標題強調「分岔革命」,因為 UNIX 的歷史展示了軟體演化的重要機制:
graph LR
CTSS[CTSS 1961] --> MULTICS[MULTICS 1964-69]
MULTICS -->|Thompson/Ritchie 極簡化| UNIX[UNIX 1969]
UNIX --> BSD[BSD 1977-]
UNIX --> SYSV[System V 1983]
BSD -->|TCP/IP, VM| 現代
SYSV -->|商業化| 現代
BSD -.-> SunOS/Solaris
BSD -.-> FreeBSD/macOS(XNU)
MINIX[MINIX 1987] --> Linux[Linux 1991]
UNIX --> POSIX[POSIX 1988] --> LinuxMULTICS 失敗於工程複雜度,UNIX 成功於簡單與可攜,但兩者共同塑造了今日 OS 的所有核心概念:行程、樹狀檔案系統、shell、權限模型。作業系統的教科書概念,幾乎都是在 1960 年代被發明、在 1970 年代被 UNIX 定型的。
系統呼叫範例:UNIX 的極簡介面#
UNIX 將所有 I/O 收斂為四個基本系統呼叫,這是「小而正交」哲學的最好展示:
// 同一組呼叫,適用於普通檔案、終端機、pipe、socket
int fd = open("input.txt", O_RDONLY); // 取得描述子
char buf[512];
ssize_t n;
while ((n = read(fd, buf, sizeof(buf))) > 0)
write(STDOUT_FILENO, buf, n); // 寫到標準輸出
close(fd);
反觀管道組合:
cat access.log | grep "404" | awk '{print $7}' | sort | uniq -c | sort -rn
每一支程式只做一件事、以文字流為介面——這種「組合性(composability)」正是函式式程式設計所追求的管道(pipeline)思想,比 MapReduce 早了三十年出現在 shell 裡。
重點整理#
- 分時系統(CTSS 1961)為了改善人的生產力而生;MULTICS(1964)整合了虛擬記憶體、樹狀檔案系統、動態連結與保護環。
- UNIX(Thompson 1969,Ritchie 1973 以 C 重寫)以極簡、可攜、「一切皆檔案」與管道組合哲學勝出。
- C 語言是為了寫 UNIX 而生的,OS 與編譯器在此深度綁定:ABI、呼叫慣例、libc 至今仍是兩界的共同邊界。
- BSD/System V 分岔與 POSIX 標準化,經由 MINIX 傳到 Linux,構成現代 OS 的族譜。