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 進程優先級 NI 與 PR 深度解析:Nice 值、動態優先級與即時進程調度

編輯:Linux 教學

top 與 ps 輸出中的 NI (Nice) 與 PR (Priority) 看似相關,實則代表兩套不同語義的優先級體系。本文從核心調度原理切入,徹底釐清靜態 Nice、動態優先級、即時進程調度的層級關係與操作指令。

核心概念對照表

指標全名範圍含義誰修改
NINice Value-20 ~ 19使用者空間「禮讓度」,值越小越搶佔 CPU使用者(nice/renice)
PRPriority (Dynamic)0 ~ 139核心調度器實際使用的動態優先級核心(依 nice、睡眠、I/O 調整)

Nice 值:使用者可控的靜態優先級

  • 預設 0,繼承自父進程
  • nice -n 10 command:以 NI=10 啟動(較低優先級)
  • renice -n -5 -p PID:調整執行中進程(需 root 降低 nice)
  • 映射至核心優先級:PR = 20 + NI + 80(非即時進程基準 100~139)

動態優先級:核心調度器的實際依據

  • CFS (Completely Fair Scheduler) 根據 vruntime 動態計算
  • 互動式進程(睡眠多)獲得獎勵 → PR 降低(優先級升高)
  • CPU 密集型進程 → PR 升高(優先級降低)
  • ps -eo pid,ni,pri,cmd 觀察 NI 與 PR 變化

即時進程:優先級 0~99 的特權階層

  • 所有 PR 0~99 為即時進程,優先於所有非即時進程 (100~139)
  • 兩種調度策略:
    • SCHED_FIFO:先進先出,無時間片,主動放棄或阻塞才切換
    • SCHED_RR:輪轉,有時間片
  • 非即時策略:SCHED_OTHER (CFS)、SCHED_BATCH、SCHED_IDLE

chrt:即時進程控制利器

# 以 RR 優先級 10 啟動即時 bash
chrt -r 10 bash

# 查看進程調度策略與優先級
chrt -p PID

# 修改現有進程為即時
chrt -f -p 50 PID   # SCHED_FIFO priority 50

輸出範例:

pid 12345's current scheduling policy: SCHED_RR
pid 12345's current scheduling priority: 10

核心優先級宏定義

#define MAX_RT_PRIO     100   // 即時優先級 0-99
#define NICE_WIDTH      40    // nice -20~19 共 40 級
#define MAX_PRIO        (MAX_RT_PRIO + NICE_WIDTH)  // 140
#define DEFAULT_PRIO    (MAX_RT_PRIO + NICE_WIDTH/2) // 120 (nice 0)

調度原則總結

  1. 存在可執行即時進程 → **永遠**優先調度即時進程
  2. 即時進程主動讓出/阻塞 → 調度非即時進程 (CFS)
  3. Nice 值影響非即時進程在 CFS 中的 vruntime 權重

實戰建議

  • 一般服務:不要動 nice,預設 0 即可
  • 批次作業、備份、編譯:nice -n 10 降低優先級
  • 音訊/視訊即時處理、高頻交易:chrt -r 50 升為即時(需鎖定記憶體 mlockall)
  • 容器限制:docker run --cpu-rt-runtime=950000 --ulimit rtprio=99

NI 是你對核心的「建議」,PR 是核心的「決定」,即時進程則是「特權命令」。理解三者層級,進程調優不再盲目。

Copyright © Windows教程網 All Rights Reserved