萬盛學電腦網

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

Linux 進程核心知識全景:從程式到進程、fork 複製、父子關係、僵屍與執行緒

進程是作業系統資源分配的基本單位。理解 **程式 (靜態檔案) → 進程 (動態執行實體) → 執行緒 (排程單位)** 的轉化與關係,是系統程式設計、效能調優、故障診斷的基石。本文涵蓋進程建立、屬性、終結回收、孤兒/僵屍處理、Linux 執行緒實作與查詢工具。

程式 vs 進程

  • 程式:靜態可執行檔 (ELF 格式),儲存指令與資料。
  • 進程:程式的**一次執行實例**,擁有獨立虛擬位址空間 (代碼、資料、堆疊、堆、共享庫映射)、PID、PPID、檔案描述符表、訊號處理、能力、命名空間、cgroups 等核心資料結構。
  • 同一程式可同時產生多個進程 (如多個 bash、多個 nginx worker),各自獨立隔離。

進程建立:fork() + exec() 雙階段

  1. fork():父進程複製自身 → 子進程。
    • 複製頁表 (Copy-on-Write, COW),實體記憶體共享直到寫入。
    • 複製檔案描述符表 (引用計數 +1)。
    • 返回值:父進程得子 PID,子進程得 0。
  2. exec():子進程載入新程式映像,**替換**代碼/資料/堆/堆疊,**保留 PID、PPID、檔案描述符、訊號遮罩、cgroups、命名空間**。
pid_t pid = fork();
if (pid == 0) {
    // 子進程
    execlp("ls", "ls", "-l", NULL);
    perror("execlp failed"); _exit(1);
} else if (pid > 0) {
    // 父進程
    waitpid(pid, &status, 0);
} else {
    perror("fork failed");
}

進程屬性查詢

ps -eo pid,ppid,cmd,uid,euid,gid,egid,stat,pcpu,pmem,comm
# PID  PPID CMD                      UID  EUID ...
#    1    0 /sbin/init                 0    0    Ss  0.0  0.0 systemd
#  1234  1   sshd: user@pts/0         1000 1000 Ss  0.0  0.1 sshd
#  1235 1234 -bash                    1000 1000 S   0.0  0.0 bash

pstree -p          # 進程樹 (含 PID)
ls -l /proc/PID/   # 進程核心介面 (fd/, maps, status, environ, cmdline, exe, cwd, root)

進程終結與回收

  • 正常退出:exit() / return from main → 進程進入 **Zombie (殭屍)** 狀態,保留退出碼等待父進程 wait()。
  • 父進程 wait()/waitpid():讀取退出碼、釋放殭屍佔用的 task_struct。
  • 父進程先死 → 子進程成為**孤兒** → 被 init (PID 1) 或 **subreaper** 收養 → init 負責 wait() 清理。
  • 父進程未 wait() 且不死 → **殭屍堆積** → 佔用 PID/記憶體,最終耗盡 PID 上限 (/proc/sys/kernel/pid_max)。

Linux 執行緒:特殊的進程

  • Linux **無原生執行緒**,pthread_create() 實際呼叫 clone() 系統呼叫,建立**共享記憶體空間、檔案描述符、信號處理**的新進程。
  • 同一執行緒組 (Thread Group) 共享 **TGID (= PID of main thread)**,各執行緒有獨立 **TID (Thread ID)**,getpid() 回傳 TGID,gettid() 回傳 TID。
  • ps -eLf 或 top -H 顯示執行緒。

實用查詢與除錯指令

# 進程樹
pstree -p

# 進程詳細資訊
cat /proc/PID/status
cat /proc/PID/limits

# 開啟檔案
ls -l /proc/PID/fd/
lsof -p PID

# 記憶體映射
cat /proc/PID/maps
pmap -x PID

# 系統呼叫追蹤
strace -p PID -f -e trace=open,read,write,close

# 核心堆疊
cat /proc/PID/stack

ps 指令輸出進程列表

copyright © 萬盛學電腦網 all rights reserved