頂部輸出中的nice值和優先權之間的差異

頂部輸出中的nice值和優先權之間的差異

頂部預設情況下,列出兩列。我很好奇有什麼區別。我查看了手冊頁但無法弄清楚:

優先事項:

   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_RRSCHED_FIFO。這樣的過程有一個公關值小於0 chrt -r 1 top。這頂部過程會有公關-2chrt -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:我本來會發布一張顯示最佳結果的圖片,但我沒有這樣做的聲譽)

相關內容