進程是 Linux 系統資源分配與調度的基本單位。理解進程描述符(task_struct)、狀態機、組織方式與調度策略,是系統編程與性能調優的基石。
bash 實例)。引入進程概念是為了描述「執行環境的動態變化」,實現多任務並發與資源隔離。
task_struct 詳解Linux 用 struct task_struct(定義於 include/linux/sched.h)描述進程,字段超過 80 個,邏輯分組:
| 類別 | 關鍵字段示例 |
|---|---|
| 狀態信息 | state、exit_code、exit_signal |
| 調度信息 | prio、static_prio、normal_prio、rt_priority、policy、se(CFS 調度實體) |
| 標識符 | pid、tgid、uid、gid、euid、egid |
| 虛擬內存 | mm(mm_struct)、active_mm |
| 文件系統 | fs(fs_struct:cwd、root、umask)、files(files_struct:fd 表) |
| 信號處理 | sighand、blocked、pending |
| 鏈接關係 | parent、real_parent、children、sibling、group_leader |
| 處理器上下文 | thread(thread_struct:寄存器、TLS、FPU 狀態) |
核心定義於 include/linux/sched.h 的 task_state_array:
SIGSTOP、SIGTSTP 等暫停信號。ptrace)。wait() 回收,保留退出碼。狀態轉換由 set_task_state()、wake_up_process()、schedule() 等函數驅動。
init_task 為頭節點,雙向環狀鏈表串聯所有 task_struct,便於遍歷(for_each_process 宏)。pid_hash,以 PID 為鍵 O(1) 查找。rq(struct rq),CFS 使用紅黑樹(rb_root_cfs)按 vruntime 排序;實時隊列用優先級陣列。wait_queue_head_t,事件驅動同步核心,支持獨佔/非獨佔喚醒。現代核心(2.6.23+)採用 CFS(完全公平調度),核心思想:將 CPU 時間按權重比例分配給可運行任務,以 vruntime(虛擬運行時間)衡量公平性。輔以實時調度類(SCHED_FIFO、SCHED_RR)、截止時間調度(SCHED_DEADLINE)。
優秀調度器的五大指標:
CFS 通過 sched_latency_ns、sched_min_granularity_ns、sched_wakeup_granularity_ns 等參數動態平衡上述指標。