前言
文章寫于學習Redis時對aof后臺重寫中寫時復制的疑問
一、感到不理解的歧義
在部分技術文檔中(以小林的文章為例),對寫時復制后的內存權限存在如歧義:
!
二、正確技術表述
根據Linux內核實現(5.15+版本),寫時復制的內存權限變化應表述為:
"在fork()
創建子進程后,父子進程通過共享只讀頁表項指向同一物理頁。當任一進程嘗試寫入時,CPU的MMU單元會觸發缺頁異常。內核處理程序將執行以下操作:
- 分配新物理頁并復制原始內容
- 僅修改當前進程的頁表項,將其指向新物理頁并標記為可寫
- 保持其他共享進程的頁表項不變,仍指向原物理頁且保持只讀屬性"
附:概念關系圖
進程A寫操作│▼
觸發缺頁異常 ──┐│ │▼ │
內核分配新物理頁 <──┘│▼
更新進程A頁表項:- 指向新物理頁- 標記為可寫│└── 進程B頁表項保持不變:- 仍指向原物理頁- 保持只讀屬性