copy_on_write

轉:

http://blog.csdn.net/yanyiyyy/article/details/6532030

 

Linux中內存的管理和分配

Linux的頁目錄表和頁表是在程序head.s中設置的.head.s程序在物理地址0處存放了一個頁目錄表,緊隨其後的是4個頁表.

page.s程序用於實現頁異常中斷處理過程,其中缺頁和頁寫保護引起的中斷分別調用memory.c的do_no_page()和do_wp_page()函數進行處理.do_no_page()會把需要的頁面從塊設備中取到內存指定位置處.在共享內存頁面的情況下,do_wp_page()會複製被寫的頁面,同時取消頁面的共享.

 

寫時複製機制

爲了節約物理內存,在調用fork()生成新進程時,新進程與原進程會共享同一內存區.只有當其中一進程進行寫操作時,系統纔會爲其另外分配內存頁面.這就是寫時複製機制(copy on write)的意思.

當進程A使用系統調用fork創建一個子進程B時,由於子進程B實際上是父進程A的一個拷貝,因此會擁有與父進程相同的物理頁面.爲了節約內存和加快創建速度的目標,fork()函數會讓子進程B以只讀方式共享父進程A的物理頁面.同時將父進程A對這些物理頁面的訪問權限也設成只讀.這樣,當父進程A或子進程B任何一方對這些已共享的物理頁面執行寫操作時,都會產生頁面出錯異常(page_fault int14)中斷,此時CPU會執行系統提供的異常處理函數do_wp_page()來解決這個異常.

do_wp_page()會對這塊導致寫入異常中斷的物理頁面進行取消共享操作,爲寫進程複製一新的物理頁面,使父進程A和子進程B各自擁有一塊內容相同的物理頁面.最後,從異常處理函數中返回時,CPU就會重新執行剛纔導致異常的寫入操作指令,使進程繼續執行下去.

 

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