萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 核心 fork() 系統呼叫實作機制深度解析:Copy-on-Write 與 clone() 架構

fork() 是 Unix 系統創建進程的核心系統呼叫。Linux 採用 Copy-on-Write (COW) 與統一的 clone() 系統呼叫實現高效進程創建。本文深入剖析核心原始碼層面的實作流程。

傳統 fork() vs Linux COW 實作

傳統實作Linux COW
直接複製整個位址空間父子進程共享同一份物理頁框(唯讀)
效能差、記憶體浪費僅複製頁表指標,標記為 COW
fork() 後立即 exec() 仍需全量複製fork() 後 exec() 觸發頁錯誤才分配新頁(零複製)

系統呼叫進入點:clone() 統一架構

sys_fork()      -> clone(SIGCHLD, 0)
sys_vfork()     -> clone(CLONE_VFORK | CLONE_VM | SIGCHLD, 0)
sys_clone()     -> clone(flags, stack, ptid, tls, ctid)

所有進程/執行緒創建最終呼叫 kernel/fork.c:do_fork()

do_fork() 核心流程

  1. copy_process():建立 task_struct、核心堆疊、thread_info
    • dup_task_struct():複製描述符(此時父子完全相同)
    • 檢查 RLIMIT_NPROC 進程數限制
    • 初始化統計計數器、清除繼承不當的旗標(PF_SUPERPRIV, PF_FORKNOEXEC)
    • get_pid() 分配 PID
    • 根據 clone_flags 共享/複製:檔案描述符表、檔案系統資訊、訊號處理、位址空間(mm_struct)、命名空間
    • 父子平分剩餘時間片
  2. 喚醒子進程:wake_up_new_task() 置入執行佇列
  3. 排程器優先執行子進程:避免父進程先寫入觸發 COW 頁錯誤,因子進程常緊接 exec()

關鍵資料結構

  • task_struct:進程描述符,核心最重要結構
  • mm_struct:位址空間描述符,COW 共享單位
  • vm_area_struct:虛擬記憶體區域(VMA),記錄權限、對應檔案

COW 頁錯誤處理流程

  1. 進程嘗試寫入共享頁 → 頁錯誤(Page Fault)
  2. handle_mm_fault() -> do_wp_page()
  3. 分配新物理頁,複製內容,更新頁表指向新頁,標記可寫
  4. 若引用計數歸零,釋放原共享頁

效能優化要點

  • vfork():共享 mm_struct,子進程先執行,父進程阻塞至 exec()/exit(),極低開銷但限制多
  • clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND):Linux 執行緒實作基礎(NPTL)
  • 大型進程 fork() 後立即 exec() 可避免 COW 開銷

fork() 實作架構圖

深入理解 fork()/clone()/COW 機制,是 Linux 系統程式設計、容器技術(Namespace/Cgroups)與高效能伺服器開發的核心基礎。

copyright © 萬盛學電腦網 all rights reserved