1969 - Unix 誕生(極簡戰勝雄心)#
案件摘要#
1969 年夏天,Bell 實驗室的 Ken Thompson 在被閒置的 PDP-7(8K 記憶體)上,用組合語言寫出一個極簡作業系統——Unix。 它與 Multics 的雄心相反:單一檔案樹、一切皆檔案、小工具組合、極簡核心。
\[ \text{Multics(數百萬行、一次到位)} \quad \text{vs} \quad \text{Unix(幾千行、極簡正確)}. \]
歷史上最有影響力的作業系統,誕生於一台被淘汰的二手電腦上——極簡的勝利。
前因 -- 為什麼會有這個案子#
- Multics 的撤退:Bell 實驗室 1969 年退出 Multics 專案,Thompson 與 Ritchie 失去研究環境,也失去「大型系統」的信仰。
- 太空旅行遊戲的原始動機:Thompson 把自己的「Space Travel」遊戲移植到 PDP-7——需要檔案系統、行程管理、編輯器。遊戲逼出了作業系統。
- 匱乏逼出極簡:8K 記憶體裝不下任何雄心,只能保留本質。
線索與推理 -- 數學式、程式、理論#
第一條線索:一切皆檔案 (everything is a file)#
檔案、目錄、設備、行程資訊——全部是檔案描述子:
\[ \text{open / read / write / close} \quad \text{適用於一切}. \]
- 彌補的缺陷:早期 OS 每種設備一套專用 API,程式無法通用。統一介面讓工具組合成為可能。
第二條線索:單一階層檔案樹#
\[ / \;\subset\; \text{bin, etc, usr, home} \;\subset\; \cdots \]
從 Multics 學來的單一棵樹——所有資源的統一命名空間,路徑即唯一位址。
第三條線索:fork + exec 的行程模型#
\[ \text{fork() 複製} \;+\; \text{exec() 換身} \;=\; \text{新行程的誕生}. \]
- 彌補的缺陷:CTSS/Multics 的「spawn 帶一堆參數」設計複雜;fork/exec 把「建立」與「執行」拆開,反而更簡單、更可組合(shell 的重定向、pipe 都靠它)。
C 語言示範:Unix 核心三寶#
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(void) {
/* 一切皆檔案:讀檔案與讀設備是同一組呼叫 */
int fd = open("/etc/hostname", O_RDONLY);
char buf[128];
int n = read(fd, buf, sizeof(buf) - 1);
close(fd);
buf[n] = 0;
printf("hostname: %s\n", buf);
/* fork + exec:新行程的最小組合 */
pid_t pid = fork();
if (pid == 0)
execlp("echo", "echo", "hello from child", NULL);
else
wait(NULL);
return 0;
}
結案 -- 後果與影響#
- 1971 年第一版手冊問世(見
1971-第一版手冊與檔案系統.md)。 - 1973 年以 C 重寫後可移植、管道問世(見
1973-Unix以C重寫與管道.md)。 - 1983 年 Thompson 與 Ritchie 同獲圖靈獎——一台二手 PDP-7 上的幾千行程式碼,贏得系統科學最高榮譽。
- 歷史教訓:Multics 用數百萬行證明雄心的代價;Unix 用幾千行證明極簡的力量。
關鍵人物與文獻#
- K. Thompson:〈UNIX Implementation〉(1978)。
- D. M. Ritchie & K. Thompson:〈The UNIX Time-Sharing System〉, CACM 17(7), 1974。
- 相關案件:
1964-System360與OS360.md、1973-Unix以C重寫與管道.md。