首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux 進程創建記憶體細節:fork、Copy-on-Write 與地址空間繼承

     編輯:關於C語言

Linux 進程創建記憶體細節:fork 與 Copy-on-Write

fork() 創建子進程時,記憶體佈局發生什麼變化?理解這一機制對高效編寫多進程程式、診斷記憶體問題至關重要。

核心記憶體分區繼承規則

記憶體區域子進程擁有共享/複製機制備註
代碼段 (Text)否共享只讀,父子映射同一物理頁框
資料段 (Data)是Copy-on-Write初始共享,寫入時複製
堆是Copy-on-Writemalloc 區域同 COW
堆疊是Copy-on-Write各自獨立生長

詳細機制解析

  1. 獨立地址空間:子進程擁有完整虛擬地址空間副本,邏輯地址相同,物理頁框初始共享
  2. 代碼段共享:不可寫,天然共享,節省記憶體
  3. 資料/堆/堆疊 COW:頁表標記為唯讀,父子共用物理頁。任一方嘗試寫入 → 頁面錯誤 → 內核分配新物理頁、複製內容、更新頁表 → 寫入完成
  4. 無直接複製:fork() 只複製頁表、建立 COW 標記,不複製實際內容,極快(微秒級)
  5. 寫時複製觸發:子進程修改變數、execve() 載入新程式、malloc/free 操作堆
  6. 修改隔離:COW 後物理頁分離,父子互不影響
  7. 效能優勢:避免不必要的複製,特別是大量記憶體的進程 fork() 後立即 exec()(Shell 啟動程式典型模式)

驗證程式:觀察 COW 行為

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int global = 100;

int main() {
    int local = 200;
    pid_t pid = fork();

    if (pid == 0) {  // 子進程
        printf("Child: global=%d (addr=%p), local=%d (addr=%p)\n",
               global, &global, local, &local);
        global = 300;  // 觸發 COW
        local = 400;
        printf("Child after write: global=%d, local=%d\n", global, local);
    } else {  // 父進程
        sleep(1);  // 等待子進程修改
        printf("Parent: global=%d (addr=%p), local=%d (addr=%p)\n",
               global, &global, local, &local);
        wait(NULL);
    }
    return 0;
}

輸出:

Child: global=100 (addr=0x55a...), local=200 (addr=0x7ff...)
Child after write: global=300, local=400
Parent: global=100 (addr=0x55a...), local=200 (addr=0x7ff...)

虛擬地址相同,物理頁寫入後分離,父進程數值未變。

進階:vfork() 與 clone()

  • vfork():不複製頁表,子進程在父進程地址空間直接運行,禁止修改記憶體,僅用於緊接 exec(),現代 Linux 已合併實現
  • clone():底層系統呼叫,fork()/pthread_create()/vfork() 均基於此,透過 flags 控制共享程度 (CLONE_VM, CLONE_FS, CLONE_FILES...)

實務建議

  1. fork() 後盡快 exec() 或 _exit(),減少 COW 開銷
  2. 大記憶體進程避免頻繁 fork(),考慮 posix_spawn() 或線程池
  3. 子進程只讀父進程資料時,COW 零開銷共享極高效
  4. 多進程共享記憶體需顯式 mmap(MAP_SHARED) 或 System V 共享記憶體
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved