Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 進程管理核心:從 PCB 到調度算法全景解析

編輯:Linux 教學

進程是 Linux 系統資源分配與調度的基本單位。理解進程描述符(task_struct)、狀態機、組織方式與調度策略,是系統編程與性能調優的基石。

程序與進程的本質區別

  • 程序:靜態的可執行文件(ELF 格式),包含代碼段、數據段、符號表、重定位表,靜止於磁碟。
  • 進程:程序的動態執行實體,擁有獨立虛擬地址空間、打開文件表、信號處理、當前工作目錄、用戶/組 ID 等運行時上下文。同一程序可啟動多個進程(如多個 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:

  • TASK_RUNNING (0):運行中或就緒(在運行隊列中)。
  • TASK_INTERRUPTIBLE (S):淺度睡眠,可被信號喚醒。
  • TASK_UNINTERRUPTIBLE (D):深度睡眠,不可被信號打斷(如等待磁碟 I/O)。
  • __TASK_STOPPED (T):收到 SIGSTOP、SIGTSTP 等暫停信號。
  • __TASK_TRACED (t):被調試器跟蹤(ptrace)。
  • EXIT_ZOMBIE (Z):進程結束,父進程未 wait() 回收,保留退出碼。
  • EXIT_DEAD (X):最終狀態,即將被銷毀。

狀態轉換由 set_task_state()、wake_up_process()、schedule() 等函數驅動。

PCB 組織方式

  1. 任務鏈表:init_task 為頭節點,雙向環狀鏈表串聯所有 task_struct,便於遍歷(for_each_process 宏)。
  2. PID 雜湊表:pid_hash,以 PID 為鍵 O(1) 查找。
  3. 可運行隊列:每 CPU 一個 rq(struct rq),CFS 使用紅黑樹(rb_root_cfs)按 vruntime 排序;實時隊列用優先級陣列。
  4. 等待隊列:wait_queue_head_t,事件驅動同步核心,支持獨佔/非獨佔喚醒。

調度算法與評價指標

現代核心(2.6.23+)採用 CFS(完全公平調度),核心思想:將 CPU 時間按權重比例分配給可運行任務,以 vruntime(虛擬運行時間)衡量公平性。輔以實時調度類(SCHED_FIFO、SCHED_RR)、截止時間調度(SCHED_DEADLINE)。

優秀調度器的五大指標:

  • 公平性:同優先級任務獲得比例 CPU 時間。
  • 高效性:CPU 利用率最大化,減少調度開銷。
  • 響應時間:交互任務(GUI、終端)極低延遲。
  • 周轉時間:批處理任務從提交到完成的總時間。
  • 吞吐量:單位時間完成任務數。

CFS 通過 sched_latency_ns、sched_min_granularity_ns、sched_wakeup_granularity_ns 等參數動態平衡上述指標。

Copyright © Windows教程網 All Rights Reserved