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.