Linux

如何計算程序優先級?

  • February 17, 2020

有人可以解釋如何計算“真實”流程優先級(即pri_baz的欄位ps)嗎?

我的猜測是:

pri_baz = 99 - static_priority  # if static_priority > 0 (real-time process)
pri_baz = 100 + min(20 + nice + dynamic_adjustment, 39)  # if static_priority = 0 (time-shared process)

以下測試支持這一點:

# chrt -r 1 sleep 1 \
> & chrt -r 99 sleep 1 \
> & nice --20 sleep 1 \
> & nice -19 sleep 1 \
> & ps -C sleep -O pri_baz
[1] 25408
[2] 25409
[3] 25410
[4] 25411
  PID BAZ S TTY          TIME COMMAND
25408  98 S pts/3    00:00:00 sleep 1
25409   0 S pts/3    00:00:00 sleep 1
25410 100 S pts/3    00:00:00 sleep 1
25411 139 S pts/3    00:00:00 sleep 1

但是我很困惑,因為:

  1. pri_baz= 99 似乎未使用。
  2. 我知道 Linux 處理(預設情況下)140 個優先級隊列,而這個方案只給出了 139 個優先級值。

ps的輸出中,pri_baz計算為 pp->priority + 100,並且pp->priorityprio來自核心的值。這被描述為

程序的優先級從 0..- MAX_PRIO1 開始,有效的 RT 優先級是 0..- MAX_RT_PRIO1,並且SCHED_NORMAL/SCHED_BATCH 任務在MAX_RT_PRIO..- MAX_PRIO1 範圍內。優先級值是相反的:較低的p->prio值意味著較高的優先級。

MAX_USER_RT_PRIO值允許將實際最大 RT 優先級與導出到使用者空間的值分開。這允許核心​​執行緒將其優先級設置為高於任何使用者任務的值。注意: MAX_RT_PRIO不得小於MAX_USER_RT_PRIO

所以核心中的範圍確實涵蓋了 140 個值,從 0 到MAX_PRIO–1 (139)。

但是,最小 FIFO 和 RT 優先級是 1,這解釋了缺失值:輸入值(至少,可以從使用者空間設置,使用sched_setscheduler)從 1 變為 99,核心使用公式將這些值轉換為prio MAX_RT_PRIO值– 1 –優先級,給出從 0 到 98 的值。

引用自:https://unix.stackexchange.com/questions/568029