進程是作業系統資源分配的基本單位。理解 **程式 (靜態檔案) → 進程 (動態執行實體) → 執行緒 (排程單位)** 的轉化與關係,是系統程式設計、效能調優、故障診斷的基石。本文涵蓋進程建立、屬性、終結回收、孤兒/僵屍處理、Linux 執行緒實作與查詢工具。
bash、多個 nginx worker),各自獨立隔離。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)。pthread_create() 實際呼叫 clone() 系統呼叫,建立**共享記憶體空間、檔案描述符、信號處理**的新進程。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
