Windows核心編程 - Windows內存體系結構(4)

1. 寫時複製

      PAGE_WRITECOPY和PAGE_EXECUTE_WRITECOPY這兩個保護屬性存在的目的是爲了節省內存和使用頁交換文件。Windows支持一種機制,允許兩個或兩個以上的進程共享同一塊存儲器。讓應用程序實例共享相同的存儲頁極大地提升了系統的性能,但另一方面,也要求所有的應用程序實例只能讀取其中的數據 或是執行其中的代碼。如果某個應用程序實例修改並寫入一個存儲頁,則是等於修改了其它應用程序實例正在使用的存儲頁,導致混亂。爲了避免這種混亂,操作系統會給共享的存儲頁指定“寫時複製”的屬性。通常,包含代碼的頁面被標記爲PAGE_EXECUTE_READ,而包含數據的頁面被標記爲PAGE_READWRITE.

          當線程試圖寫入一個共享頁面時,操作系統會介入並執行下面的操作:

   1)系統在內存中找到一個閒置頁面。該閒置頁面的後備頁面來自頁交換文件,它是系統最初將模塊映射到進程的地址空間時分配的。由於系統在第一次進行映射的時候分配了所有可能需要的頁交換文件空間,這一步不可能失敗。

    2)系統把線程想要修改的頁面內容複製到在第1)步中找到的閒置頁面。系統會給該閒置頁面指定PAGE_READWRITE或PAGE_EXECUTE_READWRITE保護屬性,系統不會對原始頁面的保護屬性和數據做任何修改。

    3)然後,系統更新進程的頁面表, 這樣一來,原來的虛擬地址就對應到了內存中一個新的頁面了。

       系統在執行這些步驟之後,進程就可以說它自己的副本了。此外,在預訂的地址空間或調撥物理存儲器,不能使用PAGE_WRITECOPY或PAGE_EXECUTE_WRITECOPY保護屬性,否則會導致調用VirtualAlloc失敗。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章