2013-05-08 37 views
1

在閱讀頁面錯誤和頁面命中是如何由頁面錯誤異常處理程序處理的時候,有一點我不清楚。如果進程正在使用共享頁面併發生頁面錯誤,那麼當頁面錯誤異常處理程序更新導致頁面錯誤的進程的頁表表項中的頁表項時,它是否也會更新所有頁面中的頁表項共享相同頁面的其他進程?從我對這個主題的閱讀看來,它似乎只更新頁表中錯誤進程的頁表項,但其他進程怎麼知道該頁已被分頁呢?提前致謝!頁面錯誤異常處理程序和更新頁表

回答

0

這是您在設計內存管理器時必須解決的問題之一。一種可能的設計是爲每個可以共享的頁面設置一個影子PTE。當共享頁面上的進程發生故障時,內存管理器會檢查影子PTE。如果影子PTE不駐留,它將以正常方式處理頁面錯誤,當頁面可用時更新錯誤處理PTE和影子PTE。如果影子PTE是駐留的,那麼它只是將影子PTE複製到進程PTE。當進程實際觸及頁面時,這種方式只會更新PTE。這就是我認爲Windows的做法 - 我對Linux的瞭解有限,但由於幾乎Linux進程中的每個頁面都可以隨時共享(由於分叉),所以我期望他們有不同的方式來處理共享,而不必爲系統中的每個頁面都設置影子PTE。

在這個模型中,如果你有異步頁面錯誤處理,那麼需要一些聰明才智,因爲你需要處理頁面上的另一個進程發生故障時的情況。你還需要處理頁面輸出的情況。在這種情況下,您需要瀏覽每個包含其工作集頁面的進程並將其刪除,這可能需要一些IPI和一些記錄。