在 Linux 中,每個進程由一個 task_struct 資料結構描述。在 Linux 術語中,「任務」與「進程」是同義詞,task_struct 實際上就是傳統所說的「進程控制塊」(PCB, Process Control Block)。它包含進程的所有資訊,是系統控制進程的唯一且最有效手段。
Linux 2.4 起為每個新建立的進程動態分配 task_struct。系統允許的最大進程數由實體記憶體大小決定。以 IA32 架構為例,512MB 記憶體的機器最大進程數可達 32K,這相比舊核心(2.2 以前)有巨大提升。
Linux 支援對稱多處理器(SMP),系統允許最多 32 個 CPU。單處理器模式下僅有一個 CPU。本文主要討論單處理器情況。
Linux 支援兩類進程:
這兩類進程的區別反映在 task_struct 的排程相關欄位中。
task_struct 結構龐大但結構清晰,依功能可分為以下類別:
| 分類 | 主要欄位說明 |
|---|---|
| 進程狀態 | state, exit_code, exit_signal, pdeath_signal 等 |
| 排程資訊 | policy, rt_priority, priority, counter, nice 值等 |
| 各類識別碼 | pid, tgid, uid, gid, euid, egid, suid, sgid, fsuid, fsgid |
| 進程通訊 (IPC) | sysvsem, semundo, signal, sighand, blocked, sigpending 等 |
| 時間與計時器 | times, start_time, real_timer, itimer_real, itimer_virt, itimer_prof |
| 進程鏈結資訊 | p_opptr, p_pptr, p_cptr, p_ysptr, p_osptr, thread_group 等 |
| 檔案系統資訊 | fs, files, namespace, fs_excl |
| 虛擬記憶體資訊 | mm, active_mm, mmap_cache, swap_address |
| 頁面管理 | page_table_lock, min_flt, maj_flt, nswap, cnswap |
| SMP 相關 | processor, cpus_allowed, run_list |
| 處理器相關環境 (Context) | thread (暫存器狀態、堆疊指標等) |
| 其他資訊 | journal_info, audit_context, seccomp 等 |
state 欄位表示進程當前狀態:
TASK_RUNNING:執行中或就緒TASK_INTERRUPTIBLE:可中斷睡眠TASK_UNINTERRUPTIBLE:不可中斷睡眠TASK_STOPPED:暫停TASK_ZOMBIE:殭屍進程EXIT_DEAD:已死policy:排程策略(SCHED_NORMAL, SCHED_FIFO, SCHED_RR, SCHED_BATCH, SCHED_IDLE)rt_priority:即時優先級(0-99,即時進程使用)priority:動態優先級nice:靜態優先級調整值(-20 到 +19)Linux 採用多層級識別碼體系:
mm 指向 mm_struct,描述進程位址空間;active_mm 用於核心執行緒借用位址空間。mmap_cache 加速記憶體映射查找。
# 查看進程 task_struct 關鍵資訊
cat /proc//status
cat /proc//sched
cat /proc//schedstat
# 核心開發者可用 crash 工具分析 task_struct
crash> struct task_struct
task_struct 是 Linux 進程管理的核心資料結構,理解其欄位佈局與功能分類,對於核心開發、驅動程式撰寫、系統效能調校與容器技術理解都至關重要。建議搭配核心原始碼 include/linux/sched.h 與 kernel/sched/ 目錄深入研讀。