Linux缺頁異常(寫時複製 請求調頁)
在程式的執行過程中,因為遇到某種障礙而使 CPU 無法最終訪問到相應的物理記憶體單元,即無法完成從虛擬地址到實體地址對映的時候,CPU 會產生一次缺頁異常,從而進行相應的缺頁異常處理。基於 CPU 的這一特性,Linux 採用了請求調頁(Demand Paging)和寫時複製(Copy On Write)的技術。
1.請求調頁是一種動態記憶體分配技術,它把頁框的分配推遲到不能再推遲為止。這種技術的動機是:程序開始執行的時候並不訪問地址空間中的全部內容。事實上,有一部分地址也許永遠也不會被程序所使用。程式的區域性性原理也保證了在程式執行的每個階段,真正使用的程序頁只有一小部分,對於臨時用不到的頁,其所在的頁框可以由其它程序使用。因此,請求分頁技術增加了系統中的空閒頁框的平均數,使記憶體得到了很好的利用。從另外一個角度來看,在不改變記憶體大小的情況下,請求分頁能夠提高系統的吞吐量。當程序要訪問的頁不在記憶體中的時候,就通過缺頁異常處理將所需頁調入
2.寫時複製主要應用於系統呼叫fork,父子程序以只讀方式共享頁框,當其中之一要修改頁框時,核心才通過缺頁異常處理程式分配一個新的頁框,並將頁框標記為可寫。這種處理方式能夠較大的提高系統的效能,這和Linux建立程序的操作過程有一定的關係。在一般情況下,子程序被建立以後會馬上通過系統呼叫 execve將一個可執行程式的映象裝載進記憶體中,此時會重新分配子程序的頁框。那麼,如果fork的時候就對頁框進行復制的話,顯然是很不合適的。
在上述的兩種情況下出現缺頁異常,程序運行於使用者態,異常處理程式可以讓程序從出現異常的指令處恢復執行,使使用者感覺不到異常的發生。當然,也會有異常無法正常恢復的情況,這時,異常處理程式會進行一些善後的工作,並結束該程序。也就是說,執行在使用者態的程序如果出現缺頁異常,不會對作業系統核心的穩定性造成影響。