fork() 是 Unix 系統創建進程的核心系統呼叫。Linux 採用 Copy-on-Write (COW) 與統一的 clone() 系統呼叫實現高效進程創建。本文深入剖析核心原始碼層面的實作流程。
| 傳統實作 | Linux COW |
|---|---|
| 直接複製整個位址空間 | 父子進程共享同一份物理頁框(唯讀) |
| 效能差、記憶體浪費 | 僅複製頁表指標,標記為 COW |
| fork() 後立即 exec() 仍需全量複製 | fork() 後 exec() 觸發頁錯誤才分配新頁(零複製) |
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()
task_struct、核心堆疊、thread_info
dup_task_struct():複製描述符(此時父子完全相同)RLIMIT_NPROC 進程數限制PF_SUPERPRIV, PF_FORKNOEXEC)get_pid() 分配 PIDclone_flags 共享/複製:檔案描述符表、檔案系統資訊、訊號處理、位址空間(mm_struct)、命名空間wake_up_new_task() 置入執行佇列exec()task_struct:進程描述符,核心最重要結構mm_struct:位址空間描述符,COW 共享單位vm_area_struct:虛擬記憶體區域(VMA),記錄權限、對應檔案handle_mm_fault() -> do_wp_page()vfork():共享 mm_struct,子進程先執行,父進程阻塞至 exec()/exit(),極低開銷但限制多clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND):Linux 執行緒實作基礎(NPTL)fork() 後立即 exec() 可避免 COW 開銷
深入理解 fork()/clone()/COW 機制,是 Linux 系統程式設計、容器技術(Namespace/Cgroups)與高效能伺服器開發的核心基礎。