Process 與 CPU 基礎指南

Process 與 CPU 基礎指南

1. CPU Time:user / system / real

time some_command 執行會看到三個數字:

real    0m2.140s
user    0m1.820s
sys     0m0.300s

怎麼解讀:

2. Process 生命週期:fork / exec

Linux 建立新 process 幾乎都是這個套路:

fork()  → 複製目前的 process(子 process 是父 process 的完整拷貝,包含記憶體)
exec()  → 子 process 用新的程式碼「替換」自己(不是再開一個 process)

例如在 shell 打 ls:shell fork 出一個子 process,子 process 再 execls 這個程式。這也是為什麼 fork() 之後常常馬上接 exec() — 先複製一份執行環境,再換上真正要跑的程式。

Zombie process:子 process 執行完畢,但父 process 還沒呼叫 wait() 去「收屍」讀取結束狀態,這個子 process 就變成 zombie(ps 裡狀態顯示 Z)。zombie 不佔用記憶體或 CPU,但佔一個 PID,殺不掉(因為它已經死了),只能等父 process 收屍或父 process 自己死掉讓 zombie 被 init/systemd 收養並清掉。

Orphan process:父 process 先死掉,子 process 還活著 → 子 process 被 PID 1(init/systemd)收養。

3. 訊號 (Signals)

為什麼 kill -9 有時候會有問題: 如果程式正在寫檔案、持有 lock、或子 process 還沒收拾乾淨,SIGKILL 直接讓它斷氣,這些狀態都來不及清——這就是為什麼資料庫類程式特別怕被 -9。正確做法是先 SIGTERM 給程式機會善終,等幾秒還沒死再 -9(systemddocker stop 都是這個邏輯)。

4. 常用診斷工具

工具 用途
top / htop 即時看 CPU、記憶體使用率,htop 互動性更好
ps aux 列出所有 process 的快照(PID、CPU%、MEM%、狀態)
ps -eLf 連 thread 也列出來
strace -p <pid> 追蹤某個 process 正在呼叫哪些系統呼叫(診斷「卡住在哪」很有用)
lsof -p <pid> 看某個 process 開了哪些檔案 / socket
/proc/<pid>/status 直接讀 kernel 暴露的 process 資訊(狀態、記憶體、thread 數)

/proc/<pid>/ 底下值得知道的幾個檔案:

5. Scheduler 概念(CFS)

Linux 預設用 CFS (Completely Fair Scheduler):不是固定時間片輪流跑,而是追蹤每個 process「應得的 CPU 時間比例」,誰欠得最多就先排誰上去跑,讓所有 process 長期下來拿到公平的 CPU 份額。

延伸閱讀