Linux

寫時複製不是基於頁面錯誤實現的嗎?

  • October 16, 2018

作業系統概念說

fork()我們可以使用一種稱為寫時複製的技術,它的工作原理是允許父程序和子程序最初共享相同的頁面。…當確定要使用寫時複製複製頁面時,重要的是要注意分配空閒頁面的位置。**許多作業系統為此類請求提供了一個空閒頁面池。這些空閒頁面通常在程序的堆棧或堆必須擴展時或當存在要管理的寫時複製頁面時分配。**作業系統通常使用一種稱為按需零填充的技術來分配這些頁面。按需填零頁面在分配之前已被清零,從而擦除了以前的內容。

寫時複製不是基於頁面錯誤實現的嗎?(我覺得不是)

寫時複製和頁面錯誤是否共享相同的空閒頁面池?如果不是,為什麼?(我覺得不是)

malloc()基於缺頁實現的嗎?(我想是的,但不確定為什麼它與寫時複製共享相同的空閒頁面池,如果頁面錯誤未使用該池)

謝謝。

(由於這被標記為linux,我在這種情況下回答。這些都不是 Linux 獨有的。)

寫時複製不是基於頁面錯誤實現的嗎?

它基於頁面錯誤。“已複製”頁面被標記為只讀。當一個程序嘗試寫入它們時,CPU 會出現故障,核心會在重新開始寫入之前複製該頁面。

寫時複製和頁面錯誤是否共享相同的空閒頁面池?如果不是,為什麼?

是的,他們有。

malloc()基於缺頁實現的嗎?

malloc()本身不操縱地址空間或分配的頁面;它完全由 C 庫處理。用於為堆分配記憶體的函式是brk(),是的,它依賴於頁面錯誤:分配的頁面被標記為不存在。這依賴於相應頁表條目中的“存在”位,核心和 MMU 使用該位來跟踪頁面是否可在記憶體中訪問。任何對不存在頁面的訪問都會導致錯誤,核心分配一個頁面並重新啟動錯誤指令。

引用自:https://unix.stackexchange.com/questions/475617