虛擬記憶體練習題 (Practice - Virtual Memory)


Question 1 - Page Fault 語意 [recall]

CPU 存取某虛擬位址時,MMU 讀到的 PTE valid bit 為 0 且位址欄位非 null。
請說明:(a) 這代表該虛擬頁處於什麼狀態?(b) 接下來由誰處理、做哪些事?(c) handler 返回後 CPU 執行哪條指令?


Question 2 - DRAM Cache 的組織 [recall]

與 SRAM cache (L1/L2/L3) 相比,VM 系統的 DRAM cache 在相聯度、寫入策略、頁大小上如何設計?根本原因是什麼?


Question 3 - PTE 權限位元與違規處理 [recall]

教科書簡化的 PTE 含 SUP、READ、WRITE 三個權限位元。
(a) SUP=Yes 的頁在 user mode 可否存取?(b) 指令違反權限位元時,系統的完整處理鏈為何?(c) 為何說權限檢查是「零額外成本」?


Question 4 - TLB 的角色與欄位切法 [recall]

(a) TLB 是什麼、cache 的內容是什麼、放在哪裡?(b) 若 TLB 有 T=2t 個 set,TLBI 與 TLBT 各取虛擬位址的哪些位元?(c) TLB miss 一定會導致 page fault 嗎?


Question 5 - 多層 Page Table 省記憶體的機制 [recall]

32-bit 位址空間、4 KB 頁、4-byte PTE 的單層 page table 需要 4 MB 常駐記憶體。兩層階層化後靠哪兩個機制省下記憶體?多層轉譯要查 k 次 PTE,為何實務上不明顯變慢?


Question 6 - Demand-Zero Pages 與 Swap Space [recall]

Linux memory mapping 的 area 可映射到 regular file 或 anonymous file。
(a) 什麼是 demand-zero page?首次 touch 時發生什麼、有無磁碟資料傳輸?(b) 頁面初始化之後在哪裡換入換出?該空間的大小限制了什麼?


Question 7 - Shared vs Private Object [recall]

兩個 process 以 mmap 映射磁碟上同一個物件。請比較 shared object 與 private object:(a) 寫入對其他映射者是否可見?(b) 寫入是否回寫磁碟?(c) 兩 process 的映射虛擬位址必須相同嗎?


Question 8 - malloc/free 的基本契約 [recall]

(a) malloc 回傳的 block 在 32-bit 與 64-bit mode 各對齊到幾的倍數?回傳的記憶體有初始化嗎?(b) free(ptr) 的 ptr 必須滿足什麼條件?違反時會怎樣?(c) 要取得清零的記憶體、或改變已配置 block 大小,分別用什麼函式?


Question 9 - 兩種碎片化 [recall]

區分 internal fragmentation 與 external fragmentation:各自的定義、成因,以及哪一種難以量化、為什麼?


Question 10 - PTE 數量與位址欄位計算 [application]

某系統虛擬位址 n = 24 bits、實體位址 m = 20 bits、頁大小 P = 2 KB。
計算:(a) page table 的 PTE 數量;(b) VPN、VPO、PPN、PPO 各佔幾個 bits。


Question 11 - Implicit Free List 的 Block Size 與 Header [application]

配置器使用 implicit free list,double-word (8-byte) 對齊,block 格式為 1-word (4-byte) header + payload + 選擇性 padding(無 footer)。
malloc(9)malloc(20) 產生的 block size,以及各自 header 的十六進位值(allocated)。


Question 12 - fork 後的 Copy-on-Write [application]

執行以下程式,fork 之後父子行程都還沒寫入任何資料,接著子行程對陣列元素賦值:

int *buf = malloc(4096);        /* 恰好一頁 */
buf[0] = 1;                     /* fork 前已 touch */
if (fork() == 0) {
    buf[0] = 42;                /* 子行程寫入 */
}

說明 fork 當下 kernel 對虛擬記憶體做了什麼、子行程執行 buf[0] = 42 時硬體與 kernel 依序發生哪些事,以及此機制一次複製多少資料。


Question 13 - Mark&Sweep 走訪與 Conservative GC [analysis]

某 heap 有已配置區塊 1–6,指標關係:3→1、4→3、4→6、6→2;唯一的 root 指向區塊 4。另外,區塊 5 的 payload 中有一個 int,其值恰好等於區塊 2 的 payload 位址。
(a) 在 exact collector 下,mark 階段後哪些區塊被標記?sweep 後哪些被回收?(b) 換成 C 的 conservative collector,且假設某 root 可達區塊中含上述那種偽裝值指向區塊 5,結果會有何不同?為什麼 C 只能這樣做?


Question 14 - 記憶體錯誤診斷 [analysis]

以下三段 C 程式各含一個經典記憶體錯誤,請指出錯誤、解釋底層機制,並說明各自最可能的發作方式:

/* (a) */ int val; scanf("%d", val);
/* (b) */ int *p = malloc(n * sizeof(int)); int sum = 0;
          for (int i = 0; i < n; i++) sum += p[i];
/* (c) */ int *stackref(void) { int val = 42; return &val; }