Linux
如何計算程序優先級?
有人可以解釋如何計算“真實”流程優先級(即
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
但是我很困惑,因為:
pri_baz
= 99 似乎未使用。- 我知道 Linux 處理(預設情況下)140 個優先級隊列,而這個方案只給出了 139 個優先級值。
在
ps
的輸出中,pri_baz
計算為pp->priority + 100
,並且pp->priority
是prio
來自核心的值。這被描述為程序的優先級從 0..-
MAX_PRIO
1 開始,有效的 RT 優先級是 0..-MAX_RT_PRIO
1,並且SCHED_NORMAL
/SCHED_BATCH
任務在MAX_RT_PRIO
..-MAX_PRIO
1 範圍內。優先級值是相反的:較低的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 的值。