
頂部預設情況下,列出兩列。我很好奇有什麼區別。我查看了手冊頁但無法弄清楚:
優先事項:
h: PR -- Priority
The priority of the task.
不錯的價值:
i: NI -- Nice value
The nice value of the task. A negative nice value means higher priority,
whereas a positive nice value means lower priority. Zero in this field
simply means priority will not be adjusted in determining a task’s dis-
patchability.
我明白那個物超所值與Kernel的CPU調度器佇列有關;那什麼是優先事項表明?也許是關於 I/O 的事情?
答案1
Nice 值是「全域」機制,而優先權與任務切換器相關現在。
答案2
不同之處在於公關是當前核心中進程的實際優先級,並且你只是向內核提示進程應該具有什麼優先權。
在多數情況下公關值可以透過以下公式計算:公關 = 20 + NI。因此,niceness 為 3 的進程的優先權為 23 (20 + 3),niceness -7 的進程的優先權為 13 (20 - 7)。您可以透過運行命令檢查第一個nice -n 3 top
。它將表明頂部行程有NI 3和公關 23。但要nice -n -7 top
在大多數 Linux 系統中運行,您需要具有 root 權限,因為實際上較低的權限公關值是實際優先順序較高的。因此,該過程與公關 13比具有標準優先權的進程具有更高的優先權公關20。這就是為什麼你需要成為root。但非根進程允許的最小niceness值可以在/etc/security/limits.conf。
理論上內核可以改變公關值(但不是你) 透過它自己。例如,如果某個進程消耗過多的CPU,它可能會降低該進程的優先權;或者,如果該進程由於其他更高優先權的進程而無法長時間運行,則可能會增加該進程的優先權。在這些情況下公關值將被內核改變你將保持不變,因此公式“PR = 20 + NI”不會是正確的。所以你value 可以解釋為內核提示程序應該具有什麼優先級,但是內核可以選擇真正的優先級(公關值)根據具體情況自行決定。但通常公式“PR = 20 + NI”是正確的。
核心如何更改優先權的確切規則尚不清楚。設定優先權(改變nice值的函數)手冊說:
更改 Nice 值的效果可能會有所不同,具體取決於有效的進程調度演算法。
線程手冊說如下:
動態優先權基於nice值(由nice(2)、setpriority(2)或sched_setattr(2)設定),並在執行緒準備執行但被調度程序拒絕執行的每個時間量程中增加。
看起來公關值對應於動態優先權。
的範圍你值為-20..19。就這樣公關value 的值可以來自0(20 - 20) 至39(20 + 19)。但它僅對於具有預設調度策略的進程是正確的(SHED_OTHER)。可能還存在所謂的進程“即時的”調度策略。這些政策是SCHED_RR和SCHED_FIFO。這樣的過程有一個公關值小於0 chrt -r 1 top
。這頂部過程會有公關-2。chrt -r 90 top
在這種情況下你甚至可以運行頂部過程會有公關-91。
看來對於SCHED_RR處理公關值可以透過以下公式計算:
PR = - 1 - sched_rr_priority。
因此一個SCHED_RR過程至少有公關-1這意味著任何SCHED_RR進程的優先權高於任何進程SCHED_OTHER。這對應於 pthread 手冊:
SCHED_FIFO 只能用於高於 0 的靜態優先權,這意味著當 SCHED_FIFO 執行緒變得可運行時,它將始終立即搶佔任何目前正在執行的 SCHED_OTHER、SCHED_BATCH 或 SCHED_IDLE 執行緒。
SCHED_RR 是 SCHED_FIFO 的簡單增強。上面針對 SCHED_FIFO 所描述的所有內容也適用於 SCHED_RR,
即時行程的優先權稱為靜態優先權,核心無法變更它。如此積極公關值可以被視為非即時的動態優先級(SCHED_OTHER,SCHED_BATCH) 過程和負公關值作為即時進程的靜態優先權(SCHED_RR,SCHED_FIFO)。
我也嘗試過跑步nice -n 10 chrt -r 50 top
(和chrt -r 50 nice -n 10 top
)。這你值為 10,但公關仍然是-51。所以看來你值不影響優先級SCHED_RR流程。這對應於設定優先權手動的:
任何使用 SCHED_FIFO 或 SCHED_RR 的程序或執行緒不應受到呼叫 setpriority() 的影響。這不被視為錯誤。隨後復原到 SCHED_OTHER 的程序的優先權不需要受到此類 setpriority() 呼叫的影響。
一張有趣的紙條。如果你跑步chrt -r 99 top
,你會看到RT值而不是數字公關柱子。
PID 使用者 PR NI VIRT RES SHR S %CPU %MEM TIME+ 指令 28489 根 RT 0 2852 1200 896 R 0 0.1 0:00.01 頂部
我不認為這意味著現在的流程很特別。我認為這意味著頂部只是不列印-100因為列印需要 4 個字元。
您也可以使用頂部代替頂部在所有範例中都可以更方便。ps -l
也可以使用,但是區分即時和非即時優先權的基點不是0,而是60,所以nice -n -20 ps -l
會列印
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 R 0 28983 28804 0 60 -20 - 1176 - 點/6 00:00:00 ps
答案3
簡答
PR 是優先權。 PR越低,進程的優先權越高。
PR 計算如下:
- 對於正常過程:PR = 20 + NI(NI 很好,範圍從 -20 到 19)
- 對於即時進程:PR = - 1 - real_time_priority(real_time_priority 範圍從 1 到 99)
長答案
有 2 種類型的進程,普通的那些和即時的 對於普通的(並且僅對於那些),nice 的應用如下:
好的
「友善」等級從 -20 到 19,而 -20 是最高優先級,19 是最低優先級。優先順序的計算方式如下:
公關 = 20 + NI
其中 NI 是良好級別,PR 是優先級。正如我們所看到的,-20 實際上映射到 0,而 19 映射到 39。
預設情況下,程式的nice值是0位,root使用者可以使用以下指令來啟動具有指定nice值的程式:
nice -n <nice_value> ./myProgram
即時的
我們還可以走得更遠。 Nice優先權其實是用於使用者程式的。儘管 UNIX/LINUX 總體優先權的範圍為 140 個值,但 Nice 值使進程能夠對應到該範圍的最後部分(從 100 到 139)。此等式使 0 到 99 之間的值無法達到,這將對應於負 PR 等級(從 -100 到 -1)。為了能夠存取這些值,該過程應該被描述為“實時”。
LINUX環境下有5種調度策略,可以透過以下指令顯示:
chrt -m
這將顯示以下列表:
1. SCHED_OTHER the standard round-robin time-sharing policy
2. SCHED_BATCH for "batch" style execution of processes
3. SCHED_IDLE for running very low priority background jobs.
4. SCHED_FIFO a first-in, first-out policy
5. SCHED_RR a round-robin policy
調度進程可分為2組,正常調度策略(1至3)和即時調度策略(4和5)。即時進程始終優先於正常進程。可以使用以下命令呼叫即時進程(範例如何聲明 SCHED_RR 策略):
chrt --rr <priority between 1-99> ./myProgram
為了獲得即時過程的 PR 值,應用以下等式:
PR = -1 - rt_prior
其中 rt_prior 對應於 1 到 99 之間的優先權。
值得注意的是,對於即時進程,不使用nice值。
若要查看進程目前的「niceness」和 PR 值,可以執行以下命令:
top
值得注意的是,例如 PR 值 -51 的進程對應於實時值。還有一些進程的 PR 值被表示為「rt」。該值實際上對應於-100的PR值。
(PS:我本來會發布一張顯示最佳結果的圖片,但我沒有這樣做的聲譽)