位址空間與 VM 快取機制 (Address Spaces & VM as Caching)
Overview Table
| 主題 | 核心概念 | 關鍵公式/術語 | 書頁 |
|---|---|---|---|
| 實體定址 (physical addressing) | CPU 直接用 physical address (PA) 存取記憶體 | 早期 PC 曾用;DSP、嵌入式微控制器、Cray 至今仍用 | p.839 |
| 虛擬定址 (virtual addressing) | CPU 產生 virtual address (VA),由 MMU 翻譯成 PA | address translation | p.840 |
| 位址空間 (address space) | 非負整數位址的有序集合;資料物件與其屬性(位址)分離 | p.840-841 | |
| VM 作為快取 | 虛擬記憶體是存於 disk 的陣列,以 DRAM 作為其快取 | virtual page (VP)、physical page (PP)、 |
p.841 |
| DRAM cache 組織 | miss penalty 巨大 → fully associative + write-back + 大 page | page 大小典型 4 KB–2 MB | p.842 |
| Page table | PTE 陣列,由 OS 維護、MMU 硬體讀取 | PTE = valid bit + 位址欄位;PTE 數 = |
p.842-843 |
| Page hit / fault | valid=1 → hit;valid=0 且已配置 → page fault 例外 | victim page、demand paging | p.844-845 |
| 配置頁面 | malloc 等觸發 OS 在 disk 建立新頁並更新 PTE |
Figure 9.8 | p.846 |
| Locality 救援 | working set 放得進實體記憶體就高效;放不下 → thrashing | temporal locality | p.846 |
9.1 實體定址與虛擬定址 (Physical and Virtual Addressing) (p.839-840)
主記憶體被組織成
- 將 VA 轉為 PA 的工作稱為 address translation(位址翻譯)。
- 如同例外處理,位址翻譯需要 CPU 硬體與作業系統緊密合作。
- CPU 晶片上的專用硬體 MMU (memory management unit) 即時 (on the fly) 翻譯虛擬位址,其使用的查找表 (lookup table) 存放在主記憶體中、內容由 OS 管理(即 page table,見 9.3.2)。
實體定址 (Figure 9.1):
PA
+-----+ 4 +--------------+
| CPU |--------------->| Main memory |
+-----+ | 0,1,2,...,M-1|
^ +--------------+
|____ data word _________|
虛擬定址 (Figure 9.2):
CPU chip
+---------------------------+
| +-----+ VA +-----+ | PA +--------------+
| | CPU |-------->| MMU |--|---------->| Main memory |
| +-----+ 4100 +-----+ | 4 +--------------+
+---------------------------+ |
^________________ data word ____________|
MMU 只是「翻譯器」,翻譯規則(page table)存在主記憶體、由 OS 維護——這正是「硬體 + OS 合作」的分工:硬體負責快、OS 負責策略。
9.2 位址空間 (Address Spaces) (p.840-841)
address space 是非負整數位址的有序集合
- virtual address space:
,其中 。 - physical address space:
,對應系統的 個 byte 實體記憶體。 - 最大虛擬位址 =
。
為何位址空間概念重要:它把「資料物件(bytes)」與「其屬性(addresses)」做出乾淨切割。一旦分離,就能讓每個資料物件擁有多個獨立位址,分別取自不同位址空間——這正是虛擬記憶體的基本想法:主記憶體的每個 byte 同時有一個 VA(取自虛擬位址空間)與一個 PA(取自實體位址空間)。
9.3 VM 作為快取工具 (VM as a Tool for Caching) (p.841-842)
概念上,虛擬記憶體是存放在 disk 上、由
- 虛擬記憶體切成固定大小的 virtual pages (VPs),每頁
bytes。 - 實體記憶體切成同樣
bytes 的 physical pages (PPs),又稱 page frames。
任一時刻,虛擬頁面集合被劃分為三個互斥子集:
| 狀態 | 定義 | 占 disk 空間? |
|---|---|---|
| Unallocated | 尚未被 VM 系統配置(建立),無任何資料 | 否 |
| Cached | 已配置且目前快取於實體記憶體 | 是 |
| Uncached | 已配置但目前不在實體記憶體 | 是 |
Virtual memory (disk) Physical memory (DRAM)
+------------------------+
VP0| Unallocated | +--------------+
VP1| Cached ----------------------> PP 0 |
VP2| Uncached | | PP 1 |
VP3| Unallocated | | ... |
VP4| Cached ----------------------> |
VP5| Uncached | | PP 2^(m-p)-1|
VP6| Cached ----------------------> |
VP7| Uncached | +--------------+
+------------------------+
共 2^(n-p) 個 VP 共 2^(m-p) 個 PP
9.3.1 DRAM Cache 的組織 (p.842)
術語約定:SRAM cache 指 CPU 與主記憶體之間的 L1/L2/L3;DRAM cache 指 VM 系統用主記憶體快取虛擬頁面的那一層。DRAM cache 在階層中的位置決定其組織方式:DRAM 比 SRAM 慢至少 10 倍,disk 比 DRAM 慢約 100,000 倍,且讀取 disk sector 第一個 byte 的成本比讀後續 byte 慢約 100,000 倍。結論:DRAM cache 的組織完全由巨大的 miss 成本驅動。
| 設計面向 | SRAM cache (L1/L2/L3) | DRAM cache (VM) | 原因 |
|---|---|---|---|
| miss 由誰服務 | 通常由 DRAM 主記憶體 | 由 disk | disk 慢 ~100,000 倍 → miss 極貴 |
| 區塊大小 | 較小(如 64 B) | 大:典型 4 KB – 2 MB | 大 miss penalty + 讀首 byte 成本高 |
| 相聯度 (associativity) | 常為 set associative | fully associative(任何 VP 可放任何 PP) | 降低 miss 率優先於查找速度 |
| 替換策略 | 硬體實作、較簡單 | OS 以精密演算法實作 | 換錯頁的代價太高 |
| 寫入策略 | write-through 或 write-back | 一律 write-back | disk 存取時間太長,不可能每次寫都落盤 |
9.3.2 Page Tables(頁表)(p.842-843)
VM 系統必須能判斷某個 VP 是否已快取於 DRAM、在哪個 PP;若 miss,還要知道該 VP 存於 disk 何處、挑選 victim page、把 VP 從 disk 複製進 DRAM。這些能力由三者合作提供:OS 軟體 + MMU 位址翻譯硬體 + 存於實體記憶體的 page table 資料結構。
- page table 是 page table entries (PTEs) 的陣列;虛擬位址空間中的每一頁在頁表中都有一個位於固定 offset 的 PTE。
- 本章簡化假設:每個 PTE = valid bit + n-bit 位址欄位。
- 位址翻譯硬體每次做 VA→PA 轉換都會讀取 page table;OS 負責維護頁表內容並在 disk 與 DRAM 間搬移頁面。
PTE 三種情形的判讀:
| valid bit | 位址欄位 | 意義 |
|---|---|---|
| 1 | DRAM 中實體頁的起始位址 | 該 VP 已快取(Cached) |
| 0 | null | 該 VP 尚未配置(Unallocated) |
| 0 | disk 上該 VP 的起始位址 | 已配置但未快取(Uncached) |
Page table (常駐 DRAM) DRAM disk
Valid PPN or disk addr
PTE 0 [ 0 | null ] +---------+ +---------+
PTE 1 [ 1 | ----------------------------> | VP1 PP0 | | VP 1 |
PTE 2 [ 1 | ----------------------------> | VP2 | | VP 2 |
PTE 3 [ 0 | ....................................... ......> | VP 3 |
PTE 4 [ 1 | ----------------------------> | VP4 PP3 | | VP 4 |
PTE 5 [ 0 | null ] +---------+ | VP 6 |
PTE 6 [ 0 | ....................................... ......> | VP 7 |
PTE 7 [ 1 | ----------------------------> | VP7 | +---------+
(實線 → DRAM;虛線 ....> disk)
因為 DRAM cache 是 fully associative,任何 PP 都可以裝任何 VP——頁表就是實現這種任意映射的查找結構。PTE 數量只跟虛擬位址空間與頁大小有關:
9.3.3 Page Hits(頁命中)(p.844)
CPU 讀取一個位於已快取頁(如 VP 2)中的字 (word) 時:
- 位址翻譯硬體以 VA 為索引定位 PTE 2 並從記憶體讀出。
- valid bit = 1 → 硬體得知 VP 2 已快取。
- 硬體用 PTE 中的實體位址(指向 PP 1 中該快取頁的起頭)組出該字的實體位址——全程純硬體,不驚動 OS。
9.3.4 Page Faults(頁錯誤)(p.844-845)
VM 術語中,DRAM cache miss 稱為 page fault。完整處理流程(以參考 VP 3、victim 為 VP 4/PP 3 為例):
CPU 參考 VP 3 中的字
|
v
翻譯硬體讀 PTE 3 --> valid = 0 且非 null(已配置未快取)
|
v
觸發 page fault exception ----> 進入 kernel 的 page fault handler
| |
| (1) 選 victim page(此例 VP 4,在 PP 3)
| (2) 若 VP 4 已被修改(dirty)→ 寫回 disk
| (3) 修改 VP 4 的 PTE:標記為不再快取
| (4) 把 VP 3 從 disk 複製到 PP 3,更新 PTE 3
| (5) handler 返回
v
重新執行 (restart) 造成 fault 的指令
|
v
同一 VA 重送翻譯硬體 → 這次是 page hit,正常完成,不再產生例外
- swapping / paging:在 disk 與記憶體間傳輸頁的活動;swapped in (paged in) = disk→DRAM,swapped out (paged out) = DRAM→disk。
- demand paging:等到 miss 發生的最後一刻才把頁換入的策略;所有現代系統都採用 demand paging(預測性換入雖可能,但非主流)。
- 術語差異的歷史原因:VM 發明於 1960 年代初,早於 CPU-memory gap 催生的 SRAM cache,故用語不同(block → page;miss → page fault)。
Linux 可用 getrusage 函式監看 page fault 次數等統計資訊 (p.847 Aside)。
Page fault 與 08-Exceptional-Control-Flow/01-Exceptions 中的 fault 類別完全對應:handler 處理完後重新執行原指令(re-execute),而非接續下一條指令——這是考試常考的例外類別判斷。
9.3.5 Allocating Pages(配置新頁)(p.846)
當 OS 配置新的虛擬記憶體頁(例如程式呼叫 malloc 的結果)時:
- 在 disk 上建立空間(該 VP 從 Unallocated → Uncached)。
- 更新對應 PTE,使其指向 disk 上新建立的頁(valid 仍為 0)。
- 注意:此時尚未載入任何內容到 DRAM;首次實際存取時才會經由 page fault 換入(demand paging 的精神)。
9.3.6 Locality 再度救援 (Locality to the Rescue Again) (p.846)
直覺上 VM 的巨大 miss penalty 似乎會摧毀效能,但實務上 VM 運作良好,關鍵在 locality(區域性):
- 程式整個執行期間參考的頁總數可能超過實體記憶體大小,但 locality 保證任一時刻程式傾向於在一組較小的活躍頁面上工作,稱為 **working set(工作集)**或 resident set。
- 初始開銷(把 working set 換入記憶體)之後,對 working set 的後續參考全是 hit,不再有 disk 流量。
- thrashing(顛簸):若 working set 大小 > 實體記憶體大小,頁面會被連續不斷地換入換出,效能崩跌。
程式效能「慢到像在爬」時,聰明的程式設計師應考慮是否正在 thrashing。VM 高效的前提是良好的 temporal locality——並非所有程式都具備,這是「VM 通常高效」這個一般化敘述的例外條件。詳見 06-Memory-Hierarchy/02-Locality-and-Memory-Hierarchy。
公式總表
| 公式 | 意義 |
|---|---|
| 虛擬位址空間大小(n = 虛擬位址位元數) | |
| 最大虛擬位址 |
n-bit 位址空間的最大位址 |
| 實體位址空間大小(簡化假設;M 實際不必為 2 的冪) | |
| 頁大小(bytes),p = 頁內偏移位元數 | |
| 虛擬頁數 = PTE 數量 | |
| 實體頁數(page frames 數) |
Exam/Test Patterns
| 情境 / 關鍵字 | 答案 |
|---|---|
| 給 n 求虛擬位址數與最大位址(Practice Problem 9.1 型) | |
| 給 n 與 P 求 PTE 數(Practice Problem 9.2 型) | |
| 「DRAM cache miss 在 VM 中叫什麼」 | page fault |
| 「為什麼 DRAM cache 是 fully associative + write-back + 大頁」 | miss 由 disk 服務、代價 ~100,000 倍 → 一切設計為極小化 miss 率;disk 太慢故不可能 write-through |
| 「page fault handler 返回後 CPU 做什麼」 | 重新執行 (restart) 造成 fault 的那條指令(fault 類例外語意),該次存取變成 hit |
| 「PTE valid=0 且位址為 null vs 非 null」 | null → Unallocated(disk 上無資料);非 null → Uncached(指向 disk 位置) |
| 「等 miss 才換入頁的策略」 | demand paging;所有現代系統採用 |
| 「任一時刻程式活躍存取的頁集合」 | working set / resident set |
| 「working set > 實體記憶體導致頁面反覆進出」 | thrashing |
| 「哪些系統仍用 physical addressing」 | DSP、嵌入式微控制器、Cray 超級電腦(及早期 PC) |
| 「誰翻譯 VA、誰維護頁表」 | MMU 硬體即時翻譯;OS 維護 page table 內容並搬移頁面 |
| 「監看 page fault 次數的 Linux 函式」 | getrusage |