跳轉到

1961 - Corbató 分時系統(CTSS:人機互動的誕生)#

案件摘要#

1961 年,MIT 的 Fernando Corbató(1926–2019) 在 IBM 709 上建成了 CTSS(Compatible Time-Sharing System)——史上第一個分時作業系統:

\[ \boxed{\text{一台電腦,同時服務多個使用者,每個人都以為機器只屬於自己}} \]

CTSS 的核心手法驚人地簡單: - 時間切片(time slice):把 CPU 時間切成小片 \(q\) ; - 輪流(round-robin):多個使用者的程式輪流上場,用完切片就換人; - 記憶體切換:換人時把記憶體內容存到磁鼓、換下一個人的進來。

\[ \text{時間切片} + \text{輪流} = \text{分時系統}. \]

在 CTSS 之前,電腦是批次處理的怪獸——使用者交出整疊卡片,等幾小時甚至幾天。 Corbató 讓「對話式計算」成為可能—— CTSS 是作業系統、電子郵件、密碼登入、乃至雲端多租戶的共同祖先。 1990 年,Corbató 獲頒圖靈獎,表彰他開創分時系統的先驅貢獻。

前因 -- 為什麼會有這個案子#

  • ENIAC 與批次時代的浪費(1946–1950s): 1946 年 ENIAC 誕生(見 1936-圖靈機.md——圖靈機在 1946 年變成真實的電腦), 但此後十五年的電腦都採批次處理(batch processing):
  • 使用者把程式打成一疊打卡片,交給櫃檯操作員;
  • 操作員整批排程:一個工作(job)獨佔整台機器,做完才換下一個;
  • 程式打錯一個字?再排一天的隊。
\[ \boxed{\text{昂貴的機器全速運轉,人卻在等待中度過一生}} \]

更荒謬的是:工程師在除錯時坐在控制台前,機器大部分時間在等人打字—— 機器閒置是浪費,人機隔離也是浪費,這是時代的兩難。 - 圖靈機的啟示(1936): 通用圖靈機(見 1936-圖靈機.md)證明了

\[ U(\langle M\rangle, x) = M(x) \quad\text{(程式 = 資料)}. \]

一台機器可以模擬任何機器——那麼一台電腦能否同時模擬多台獨立的機器, 讓每個使用者各得一台?分時系統是通用圖靈機的「多重化身」。 - 人機互動的渴望(1950s–1960s): Licklider 1960 年發表《人機共生》(Man-Computer Symbiosis), 呼喚「即時對話」的人機關係;Engelbart 更在 1968 年做出 驚天動地的「所有展示之母」(見 1968-恩格巴特超文字.md)—— 但展示的前提是有互動式的機器。沒有分時系統,就沒有 1968 的滑鼠與超文字。 - MIT 的突破口(1959–1961): John McCarthy(1958 LISP、1971 圖靈獎)1959 年在 MIT 備忘錄中 首次提出分時(time-sharing)的概念;Corbató 帶領團隊把它變成現實—— 1961 年 11 月,CTSS 首次公開示範:四個終端機同時連上 IBM 709。

線索與推理 -- 數學式、程式、理論#

第一條線索:時間切片與 round-robin 排程#

批次(FIFO):一個工作做完才換下一個——第 \(k\) 個工作要等前面全部做完:

\[ F_k^{\text{FIFO}} = \sum_{i=1}^{k} p_i. \]

分時(round-robin):每個工作輪流用切片 \(q\) —— \(N\) 個使用者、切片 \(q\) 時,每個工作第一次得到回應最多等一輪:

\[ T \approx N \times q. \]
\[ \boxed{\text{只要 } N \times q \text{ 夠小,每個人都覺得「機器只屬於自己」}} \]

例如 30 個使用者、 \(q = 20\,\text{ms}\) :最長等待 \(600\,\text{ms}\) ——比人的反應還快, 「同時」的幻覺就此誕生。這是排程理論(scheduling)的開山之作。

第二條線索:多使用者隔離——密碼的誕生(1961)#

機器同時服務多人,就必須回答:你是誰?你能碰別人的檔案嗎? - CTSS 是史上第一個使用密碼登入的系統(1961)—— 每個使用者有帳號與密碼,這是今日一切登入的祖先; - 1962 年的趣事:CTSS 的檔案系統出了 bug—— 所有使用者要編輯「歡迎訊息」檔案(welcome.txt)時, 系統卻把整本密碼檔印在了每個人的終端機上—— 全世界第一次密碼外洩,就發生在史上第一個密碼系統上!

\[ \text{第一個密碼系統(1961)} \xrightarrow{\text{第一次洩密(1962)}} \text{資安時代的開端}. \]

Corbató 事後自嘲:「這件事教會我們,安全不是事後補丁。」 - 檔案系統與郵件:CTSS 有最早的檔案系統(階層式目錄的雛形), 1965 年 Tom Van Vleck 與 Noel Morris 在 CTSS 上寫出 史上第一個電子郵件程式 MAIL——email 誕生於分時系統。

第三條線索:Multics 與分頁虛擬記憶體(1965)#

CTSS 只能同時服務約 30 人(記憶體有限:IBM 709 只有 32K words)。 1964 年起,MIT、Bell 實驗室與 GE 合作Multics(1965),目標是 「電腦像電力公司一樣,像水龍頭一樣供應計算」(utility computing): - 分頁虛擬記憶體(paging):把程式切成固定大小的「頁」(page), 不常用的頁放到磁碟上,用到時再載入——

\[ \text{虛擬位址} \xrightarrow{\text{分頁表}} \text{實體位址}. \]
\[ \boxed{\text{程式以為記憶體無限大——虛擬記憶體的誕生}} \]
  • 階層式檔案系統:樹狀目錄——UNIX 目錄結構的直接前身;
  • 動態連結:程式可以在執行中載入新的模組。 Multics 因過度工程(追求完美、體積失控)在商業上失敗, 但它教會了世界作業系統該長什麼樣。

Python:round-robin 排程器 vs 批次(FIFO)的模擬#

# CTSS 分時 vs 批次(FIFO):round-robin 排程器模擬
import collections

jobs = [("A", 8), ("B", 4), ("C", 9), ("D", 5)]  # (名稱, 所需 CPU 時間)

def fifo_schedule(jobs):
    """批次處理:一個工作做完才輪到下一個(1950 年代的打卡片時代)"""
    t, done = 0, []
    for name, need in jobs:
        t += need
        done.append((name, t))  # 完成時間
    return done

def round_robin_schedule(jobs, q=2):
    """分時系統:每個工作輪流用 q 個時間切片(1961 CTSS 的核心思想)"""
    queue = collections.deque(jobs)
    t, done = 0, []
    while queue:
        name, need = queue.popleft()
        run = min(need, q)
        t += run
        need -= run
        if need > 0:
            queue.append((name, need))
        else:
            done.append((name, t))
    return done

def avg_response(done):
    return sum(f for _, f in done) / len(done)

print("四個工作:A(8) B(4) C(9) D(5),時間切片 q=2\n")

print("批次(FIFO,1950 年代):")
for name, f in fifo_schedule(jobs):
    print(f"  工作 {name} 完成於 t={f}")
print(f"  平均完成時間 = {avg_response(fifo_schedule(jobs)):.2f}")

print("\n分時(Round-Robin,1961 CTSS):")
rr = round_robin_schedule(jobs, q=2)
for name, f in rr:
    print(f"  工作 {name} 完成於 t={f}")
print(f"  平均完成時間 = {avg_response(rr):.2f}")

print("\n觀察:FIFO 中 B 要等 A 做完 8 單位才開始;")
print("Round-Robin 下每個工作都在 q 之內得到第一次回應,")
print("互動式使用因此成為可能——這就是分時系統的革命。")
輸出:
四個工作:A(8) B(4) C(9) D(5),時間切片 q=2

批次(FIFO,1950 年代):
  工作 A 完成於 t=8
  工作 B 完成於 t=12
  工作 C 完成於 t=21
  工作 D 完成於 t=26
  平均完成時間 = 16.75

分時(Round-Robin,1961 CTSS):
  工作 B 完成於 t=12
  工作 D 完成於 t=21
  工作 A 完成於 t=23
  工作 C 完成於 t=26
  平均完成時間 = 20.50

觀察:FIFO 中 B 要等 A 做完 8 單位才開始;
Round-Robin 下每個工作都在 q 之內得到第一次回應,
互動式使用因此成為可能——這就是分時系統的革命。
偵探的解讀:FIFO 的平均完成時間較短(16.75 vs 20.50)—— 純粹以吞吐量計,批次較佳!但 round-robin 的關鍵不在平均, 而在每個工作都在 \(q\) 之內第一次上場(B 在 \(t=2\) 就動了, FIFO 卻要等到 \(t=8\) )——互動體驗(響應時間)戰勝了吞吐量, 這正是 Corbató 的革命性洞察。

結案 -- 後果與影響#

  • UNIX 的誕生(1969–1973): Bell 實驗室的 Ken Thompson 與 Dennis Ritchie 參與 Multics 計畫, 目睹它因過度工程而失敗,1969 年在廢棄的 PDP-7 上寫出精簡版—— UNIX(見 1973-UNIX作業系統.md):
\[ \text{CTSS(1961)} \xrightarrow{\text{Multics(1965)}} \text{UNIX(1969/1973)}. \]

UNIX 繼承了 Multics 的階層檔案系統、shell、多使用者, 丟棄了它的臃腫——「Multics 失敗,UNIX 成功」是工程史最著名的一課。 - 分頁虛擬記憶體的普及(1960s–1970s): Multics 的分頁虛擬記憶體成為一切現代作業系統的標配—— 今天你的筆電、手機上的每一個行程都活在虛擬位址空間裡。 - 雲端多租戶的遠祖(1961 → 2006): CTSS「一台機器服務多個使用者」的思想,在半世紀後化身為 雲端計算的多租戶(multi-tenant)架構:

\[ \text{分時系統(1961)} \xrightarrow{\text{50 年}} \text{雲端(2006)}. \]

Corbató 1965 年的預言——「計算像電力公司一樣供應」——應驗了。 - 密碼與登入的誕生(1961): 帳號、密碼、登入、檔案權限——今日一切資安的源頭都在 CTSS; 連 1962 年那次密碼外洩也成了資安意識的起點。 - 圖靈獎(1990): ACM 於 1990 年頒發圖靈獎給 Corbató,表彰 「分時系統的先驅性工作」——遲到 29 年的肯定。 2019 年,Corbató 以 93 歲高齡逝世,親眼見證自己的預言成真。 - 歷史定位:Corbató 是人機互動時代的接生婆—— 他把電腦從「整疊卡片、等待數日」的修道院, 變成「即時對話」的日常工具;

\[ \text{圖靈機(1936)} \xrightarrow{} \text{批次(1946)} \xrightarrow{\text{CTSS(1961)}} \text{互動(1968)} \xrightarrow{} \text{UNIX(1973)} \xrightarrow{} \text{雲端(2006)}. \]

一切從那個 20 毫秒的時間切片開始。

關鍵人物與文獻#

  • F. J. Corbató(1926–2019):CTSS(1961)、Multics(1965);1990 年圖靈獎。 文獻:An Experimental Time-Sharing System(1962,與 Daggett、Slater); The Compatible Time-Sharing System(1963,MIT Press)。
  • J. McCarthy(1958 LISP、1971 圖靈獎):1959 年 MIT 備忘錄首次提出分時概念。
  • K. Thompson 與 D. Ritchie:在 Multics 失敗後創 UNIX(1969/1973)——1983 年圖靈獎。
  • J. C. R. Licklider:《人機共生》(1960)——分時系統的哲學推手。
  • T. Van Vleck 與 N. Morris:CTSS 上的 MAIL(1965)——史上第一個 email。
  • 相關案件:1936-圖靈機.md、1973-UNIX作業系統.md、1968-恩格巴特超文字.md。