前面介紹了記憶體分頁的管理機制,分頁管理讓記憶體管理不再以行程為管理的單位,而是以頁為單位作為記憶體管理的基本單位,虛擬記憶體是一個能映射到實體記憶體與硬碟的儲存區域,CPU會產生一個虛擬位址,並且經過查詢每個行程個別的記憶體映射表(memory mapping table),進而能夠找到該部分的資料在記憶體中,或是其他的儲存區域裡,如果是在硬碟裡則將資料移動到記憶體中。將這兩個技術合併,就變成分頁的虛擬記憶體,便是現今最常出現的應用方式,今天要講講因為以分頁虛擬記憶體機制為基底而產生的兩個技術,分別是需求分頁 (demand page)與 寫入時複製(copy on write)。
from wiki
如果有多個呼叫者(callers)同時請求相同資源(如記憶體或磁碟上的資料儲存),他們會共同取得相同的指標指向相同的資源,直到某個呼叫者試圖修改資源的內容時,系統才會真正複製一份專用副本(private copy)給該呼叫者,而其他呼叫者所見到的最初的資源仍然保持不變。這過程對其他的呼叫者都是透明的。此作法主要的優點是如果呼叫者沒有修改該資源,就不會有副本(private copy)被建立,因此多個呼叫者只是讀取操作時可以共享同一份資源。
當父行程 fork()一個子行程之後,子行程並沒有馬上複製父行程的資料,而是暫時與父行程共用,在自己的page table上標示這部分的資料只讀不寫,直到某一方要修改其中的資料的時候,會引發分頁錯誤, do_wp_page()
函數會處理那些行程試圖修改、標示為只讀的頁面,重新分配記憶體頁面並且複製就的頁面內容到新的頁面中。