linux fork COW機制分析

2021-10-05 21:20:14 字數 2059 閱讀 3607

在linux系統中通過系統呼叫fork/clone來建立乙個新的程序,建立程序的過程中根據clone flags會選擇複製資源還是公用乙份資源,通常資源包括:開啟的檔案files_struct,檔案系統fs_struct,訊號處理signal,記憶體資源mm_struct,其中mm_struct不僅代表虛擬位址空間而且還有關聯的物理記憶體。

早期linux中fork會複製父程序中所有記憶體的資源:mm_struct,vma和頁表項,物理記憶體,但是大部分子程序不執行exec載入新的程式,父子程序共享大部分位址空間和資料,另外複製過程的代價相當昂貴,物理記憶體資源緊張,後來發明了cow機制:fork的時候只複製mm_struct和vma,但是不申請新的物理記憶體和複製記憶體內容,也就是他們的頁表項中指向同乙份物理資源。這樣就有個問題,程序中有資料段,如果一直共用乙份物理記憶體這樣就不能實現程序間位址空間隔離,所以需要對他們私有的資料進行分離,也就是可能發生寫操作的區域,分離的時機取決於寫操作發生的時候,這就是copy on write操作。為了實現這樣cow機制,它利用mmu的缺頁異常,將父子程序的頁表項都置為唯讀,當寫操作發生的時候因為許可權異常觸發mmu異常,cpu在嘗試修復異常的時候,發現如下特徵就會當做cow來修復,此時實現物理記憶體資源的分離。

頁表項存在,但是是唯讀,發生的錯誤為寫:pf_write

發生的錯誤位址位於程序的虛擬位址空間vma中,且區間的許可權允許寫操作

所以cow機制分為兩部分:fork時資源複製時複製頁表項並且將其都設定為唯讀,缺頁異常中識別cow引發的錯誤並實際分配資源實現位址空間隔離。

fork過程中複製記憶體資源,首先分配並且複製mm_struct內容,之後將其中統計字段清零。之後遍歷mm_struct->mmap鍊錶,複製其中每乙個區域,重點在於虛擬記憶體區間對應的頁表項。複製頁表項的過程中可以看到從最頂級的pgd->pud->pmd->pte逐級遍歷,如果對應的頁表項存在的話就向下逐級遍歷直到pte級別。如果頁表只有兩級pgd和pte時,拷貝pud和pmd的過程基本上是空的。

在拷貝每一項pte時核心會檢查當前是否是cow區域:1.vma區域可寫,2.vma不能是共享的,3.vma是匿名對映。

do_fork()

copy_process()

copy_mm()

dup_mm()

allocate_mm()

/* 分配新的mm_struct */

dup_mmap

(mm, oldmm)

/* 複製vma和頁表 */

dup_mmap

(struct mm_struct *mm,

struct mm_struct *oldmm)

}copy_page_range()

copy_pud_range()

copy_pmd_range()

copy_pte_range()

copy_one_pte()

copy_one_pte()

set_pte_at

(dst_mm, addr, dst_pte, pte)

;/* 設定子程序中pte寫保護位:~_page_bit_rw*/

}

對pte中標記唯讀的頁進行寫操作會觸發mmu缺頁異常,缺頁異常修復中探測觸發異常的位址是否是合法的:位址位於vma區間中並且vma區間是可寫的,此時就認為是cow的頁,下面就是修復異常。缺頁異常修復返回修復型別:如果是major/minor型別,統計到程序中的maj_fault,min_fault;如果是異常則傳送訊號sigbus給程序;如果修復失敗則返回oom錯誤並傳送sigkill訊號殺死程序。

重新分配物理頁並拷貝原始頁內容到新的物理頁中

修正新的頁表項屬性

修正舊的頁表項屬性

do_page_fault()

handle_mm_fault()

__handle_mm_fault()

handle_pte_fault()

do_wp_page()

/* wp:write protect */

do_wp_page()

遺留問題:上面只是第乙個程序觸發cow機制的下半部,還有另乙個的程序如何實現cow的下半部呢?

差分隱私學習三 實現機制

在實踐中,通常使用拉普拉斯機制和指數機制來實現差分隱私。拉普拉斯機制用於數值型結果的保護,指數機制用於離散型結果的保護。拉普拉斯機制通過向確切的查詢結果中加入服從拉普拉斯分布的隨機雜訊,來實現 差分隱私保護 記位置引數為0 尺度引數為b的拉普拉斯分布為lap b 那麼其概率密度函式為 p x exp...

php自動載入autoload機制示例分享

1,自定義函式 2,spl autoload register 複製 如下 liuyuan ebuinfo var www phpgcs php autoload ll rw rw r 1 liuyuan liuyuan 800 feb 19 11 39 func autoload.php rw r...

vlc內部執行機制以及架構分

vlc 架構剖析 1.videolan簡介 1.1 videolan組成 videolan有以下兩部分組成 vls 是一種流伺服器,專門用來解決流的各種問題,它也具有一些vlc的特徵。videolan作 為伺服器可以輸出http,rtp,rtsp的流。1.2 vlc優點 下圖表示出了videolan...