跳轉到

1972 — IBM VM/370 上市:虛擬機走進市場#

案件摘要#

1972 年,IBM 正式發表 VM/370——把 Cambridge 的 CP-67 研究系統商品化,在 System/370 大型主機上提供「每個使用者一台完整虛擬機器」的服務。虛擬化從實驗室懸案正式結案為產品,大型主機時代的「雲端雛形」於焉成形。

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

  • CP-40(7094)→ CP-67(System/360 Model 67)已證明 hypervisor 可行,但 S/360 的指令集不完美(敏感指令不陷入),需要 Model 67 的特殊硬體。
  • IBM 曾一度放棄 CP-67 路線、主推 OS/VS1 與 DOS/VS,但客戶(尤其大學與大企業)強烈要求保留 VM 能力。
  • S/370 加入位址轉換硬體(DAT)與 V=R(Virtual=Real)模式,補齊了虛擬化硬體需求。
  • 商業動機:一機可同時跑「生產系統 + 測試系統 + 開發系統」,不必為了測試買第二台百萬美元主機。

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

1. 架構:Control Program(CP)+ CMS#

VM/370 = CP + CMS + ( Optionally other guest OS ):

  • CP:hypervisor,負責把實體機器虛擬化成多台 VM(虛擬 CPU、虛擬記憶體、虛擬 IO 設備)。
  • CMS(Conversational Monitor System):單使用者互動式作業系統,通常每台 VM 跑一份。
  • VM/370 也允許 VM 內再跑完整的 MVS/OS/VS——「VM 內跑 VM」。
User A: [CMS]   User B: [CMS]   User C: [MVS]
         \           |            /
          CP: VM/370 (hypervisor)
                 |
         IBM System/370 (DAT, V=R)

2. 虛擬機 = 完整機器的抽象#

CP 提供的三種虛擬化(全虛擬化 full virtualization):

資源 虛擬化機制
CPU 虛擬處理器,透過 trap-and-emulate 執行特權指令
記憶體 虛擬位址空間,兩層位址轉換
IO 虛擬設備(DASD、終端機、讀卡機模擬)

兩層位址轉換的數學式(guest VA \(\to\) guest PA \(\to\) host PA):

\[ PA_{host} = T_{host}(T_{guest}(VA)) = T_{host}(f_{guest}(p_g) + d) \]

CP 使用 shadow page table(影子頁表)合併兩層轉換,使硬體只需一次查表:

\[ T_{shadow}(VA) = T_{host}(T_{guest}(VA)) \]

3. 虛擬機快照與遷移#

因為 VM 的完整狀態(暫存器、記憶體、設備狀態)都存在 CP 管理的資料結構中,狀態可被存檔(checkpoint/checkpoint-restore)、還原、甚至搬到另一台實體機器:

\[ \text{VM state } S = \langle \text{PC}, \text{regs}, \text{mem}, \text{dev} \rangle \Rightarrow \text{save}(S),\ \text{restore}(S'),\ \text{migrate}(S \to \text{host}_2) \]

這正是今日「VM 快照」「live migration」的概念原型——遷移的數學本質是狀態轉移函數:

\[ S' = \phi(S), \quad \phi: \text{host}_1 \to \text{host}_2 \]

4. Python 模擬:VM 快照與還原#

import copy

class VirtualMachine:
    def __init__(self, name):
        self.name, self.pc, self.regs = name, 0, {"R0": 0, "R1": 0}
        self.mem = [0] * 16

    def step(self):
        self.regs["R0"] += 1          # 模擬執行
        self.pc += 1

    def snapshot(self):
        return copy.deepcopy({"pc": self.pc, "regs": self.regs, "mem": self.mem})

    def restore(self, snap):
        self.pc, self.regs["R0"] = snap["pc"], snap["regs"]["R0"]
        self.mem = copy.deepcopy(snap["mem"])

vm = VirtualMachine("GUEST1")
for _ in range(5): vm.step()
snap = vm.snapshot()              # 快照: R0=5
for _ in range(10): vm.step()     # R0 變 15
print(vm.regs["R0"])              # 15
vm.restore(snap)                  # 回到過去
print(vm.regs["R0"])              # 5  <-- 快照還原成功

結案 -- 後果與影響#

  • VM/370 成為 IBM 主機長青產品線,演化為 VM/ESA、z/VM,至今仍運行於 z15/z16 大型主機。
  • 「一台實體機跑多台 VM + 快照 + 遷移」的模型,就是 1998 年 VMware、2006 年 EC2 的藍圖——雲端的收費單位(instance)正是 VM/370 的「virtual machine」。
  • 證明虛擬機不僅是研究玩具,而是有巨大經濟價值的工程產品。
  • VM 內可跑任何 OS 的特性,也催生了「系統測試、分時租用、災難復原」等現代運維實務。

關鍵人物與文獻#

  • Robert Creasy、Richard Parmelee、Richard Seawright:CP-67/VM/370 設計者。
  • Parmelee et al., Virtual Storage and Virtual Machine Concepts, IBM Systems Journal 11(2), 1972.
  • IBM, VM/370: CP/CMS System Programmer's Guide, 1972.
  • Creasy, The Origin of the VM/370 Time-Sharing System, IBM J. R&D 25(5), 1981.
  • Seawright & MacKinnon, VM/370 — A Study of Multiplicity and Utility, IBM Systems Journal, 1979.