位址空間與 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) 非負整數位址的有序集合;資料物件與其屬性(位址)分離 N=2nM=2m p.840-841
VM 作為快取 虛擬記憶體是存於 disk 的陣列,以 DRAM 作為其快取 virtual page (VP)physical page (PP)P=2p 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 數 = N/P=2np 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)

主記憶體被組織成 M 個連續 byte 大小的單元 (cell) 的陣列,每個 byte 有唯一的 physical address (PA),從 0 開始編號。最自然的方式是 CPU 直接用 PA 存取記憶體,稱為 physical addressing;早期 PC 曾採用此法,而 DSP、嵌入式微控制器、Cray 超級電腦等「簡單」系統至今仍然如此。現代處理器則使用 virtual addressing:CPU 產生 virtual address (VA),在送往主記憶體前先被轉換為適當的 PA。

實體定址 (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 ____________|
Tip

MMU 只是「翻譯器」,翻譯規則(page table)存在主記憶體、由 OS 維護——這正是「硬體 + OS 合作」的分工:硬體負責快、OS 負責策略。


9.2 位址空間 (Address Spaces) (p.840-841)

address space 是非負整數位址的有序集合 {0,1,2,};若整數連續,稱為 linear address space(本章一律假設線性)。位址空間的大小由「表示最大位址所需的位元數」刻劃:有 N=2n 個位址的虛擬位址空間稱為 n-bit address space,現代系統通常支援 32-bit 或 64-bit。

Simplification with exceptions

M 不必是 2 的冪次(實體記憶體大小可以是任意值),書中為了簡化討論才假設 M=2m;而 N=2n 則是由位址位元數天然決定的。

為何位址空間概念重要:它把「資料物件(bytes)」與「其屬性(addresses)」做出乾淨切割。一旦分離,就能讓每個資料物件擁有多個獨立位址,分別取自不同位址空間——這正是虛擬記憶體的基本想法:主記憶體的每個 byte 同時有一個 VA(取自虛擬位址空間)與一個 PA(取自實體位址空間)。


9.3 VM 作為快取工具 (VM as a Tool for Caching) (p.841-842)

概念上,虛擬記憶體是存放在 disk 上、由 N 個連續 byte 組成的陣列,每個 byte 的虛擬位址就是陣列索引;其內容被快取在主記憶體 (DRAM) 中。如同記憶體階層中的其他快取,disk(下層)資料被切成區塊作為與 DRAM(上層)之間的傳輸單位:

任一時刻,虛擬頁面集合被劃分為三個互斥子集:

狀態 定義 占 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 資料結構

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)
Important

因為 DRAM cache 是 fully associative,任何 PP 都可以裝任何 VP——頁表就是實現這種任意映射的查找結構。PTE 數量只跟虛擬位址空間與頁大小有關:#PTE=N/P=2np(Practice Problem 9.2 的核心公式)。

9.3.3 Page Hits(頁命中)(p.844)

CPU 讀取一個位於已快取頁(如 VP 2)中的字 (word) 時:

  1. 位址翻譯硬體以 VA 為索引定位 PTE 2 並從記憶體讀出。
  2. valid bit = 1 → 硬體得知 VP 2 已快取。
  3. 硬體用 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,正常完成,不再產生例外
Tip

Linux 可用 getrusage 函式監看 page fault 次數等統計資訊 (p.847 Aside)。

Warning

Page fault 與 08-Exceptional-Control-Flow/01-Exceptions 中的 fault 類別完全對應:handler 處理完後重新執行原指令(re-execute),而非接續下一條指令——這是考試常考的例外類別判斷。

9.3.5 Allocating Pages(配置新頁)(p.846)

當 OS 配置新的虛擬記憶體頁(例如程式呼叫 malloc 的結果)時:

9.3.6 Locality 再度救援 (Locality to the Rescue Again) (p.846)

直覺上 VM 的巨大 miss penalty 似乎會摧毀效能,但實務上 VM 運作良好,關鍵在 locality(區域性):

Important

程式效能「慢到像在爬」時,聰明的程式設計師應考慮是否正在 thrashing。VM 高效的前提是良好的 temporal locality——並非所有程式都具備,這是「VM 通常高效」這個一般化敘述的例外條件。詳見 06-Memory-Hierarchy/02-Locality-and-Memory-Hierarchy


公式總表

公式 意義
N=2n 虛擬位址空間大小(n = 虛擬位址位元數)
最大虛擬位址 =N1=2n1 n-bit 位址空間的最大位址
M=2m 實體位址空間大小(簡化假設;M 實際不必為 2 的冪)
P=2p 頁大小(bytes),p = 頁內偏移位元數
#VP=N/P=2np 虛擬頁數 = PTE 數量
#PP=M/P=2mp 實體頁數(page frames 數)

Exam/Test Patterns

情境 / 關鍵字 答案
給 n 求虛擬位址數與最大位址(Practice Problem 9.1 型) N=2n,最大位址 2n1;例:n=4 → 16 個位址、最大 15;N=16 K → n=14;最大位址 2241=16M1 → n=24;N=64 T → n=46;n=54 → N=254=16 P
給 n 與 P 求 PTE 數(Practice Problem 9.2 型) #PTE=2np;例:n=12, P=1K(p=10)→ 22=4;n=16, P=16K → 22=4;n=24, P=2M → 23=8;n=36, P=1G → 26=64
「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