La differenza è che PR è una vera priorità di un processo al momento all'interno del kernel e NI è solo un suggerimento per il kernel quale priorità dovrebbe avere il processo.
Nella maggior parte dei casi il valore PR può essere calcolato con la seguente formula: PR = 20 + NI . Quindi il processo con gentilezza 3 ha la priorità 23 (20 + 3) e il processo con gentilezza -7 ha la priorità 13 (20 - 7). Puoi controllare il primo eseguendo il comando nice -n 3 top
. Mostrerà che il processo principale ha NI 3 e PR 23 . Ma per funzionare nice -n -7 top
nella maggior parte dei sistemi Linux è necessario disporre dei privilegi di root perché in realtà il valore PR inferiore è la priorità effettiva più elevata. Pertanto, il processo con PR 13 ha una priorità più alta rispetto ai processi con priorità standard PR 20. Ecco perché devi essere root. Ma il valore minimo di gentilezza consentito per il processo non root può essere configurato in /etc/security/limits.conf .
Teoricamente il kernel può cambiare il valore PR (ma non NI ) da solo. Ad esempio, può ridurre la priorità di un processo se consuma troppa CPU oppure può aumentare la priorità di un processo se tale processo non ha avuto la possibilità di essere eseguito a lungo a causa di altri processi con priorità più elevata. In questi casi il valore PR verrà modificato dal kernel e NI rimarrà lo stesso, quindi la formula "PR = 20 + NI" non sarà corretta. Quindi il valore NI può essere interpretato come suggerimento per il kernel quale priorità dovrebbe avere il processo, ma il kernel può scegliere la priorità reale ( valore PR ) da solo a seconda della situazione. Ma di solito la formula"PR = 20 + NI" è corretto.
Le regole esatte su come il kernel cambia priorità non sono chiare. Il manuale di setpriority (la funzione che cambia il valore) dice:
L'effetto della modifica del valore piacevole può variare a seconda dell'algoritmo di pianificazione del processo in vigore.
Il manuale di Pthread dice quanto segue:
La priorità dinamica si basa sul valore gradevole (impostato da nice (2), setpriority (2) o sched_setattr (2)) e aumentato per ogni volta che il thread è pronto per essere eseguito, ma negato di essere eseguito dallo scheduler.
Sembra che il valore PR corrisponda alla priorità dinamica.
L'intervallo del valore NI è -20..19 . Pertanto, il valore PR può avere valori compresi tra 0 (20 - 20) e 39 (20 + 19). Ma è corretto solo per i processi con criteri di pianificazione predefiniti ( SHED_OTHER ). Potrebbero esserci anche processi con le cosiddette politiche di pianificazione "in tempo reale" . Queste norme sono SCHED_RR e SCHED_FIFO . Tali processi hanno un valore PR inferiore a 0. È possibile verificarlo eseguendo il chrt -r 1 top
comando (è necessario essere root). Il processo principale avrà PR -2 . Puoi anche eseguire chrt -r 90 top
in questo caso il topil processo avrà PR -91 .
Sembra che per i processi SCHED_RR il valore PR possa essere calcolato con la formula:
PR = - 1 - sched_rr_priority .
Pertanto un processo SCHED_RR ha almeno PR -1, il che significa che qualsiasi processo SCHED_RR ha una priorità più elevata rispetto a qualsiasi SCHED_OTHER . Ciò corrisponde al manuale pthread:
SCHED_FIFO può essere utilizzato solo con priorità statiche superiori a 0, il che significa che quando un thread SCHED_FIFO diventa eseguibile, impedirà immediatamente qualsiasi thread SCHED_OTHER, SCHED_BATCH o SCHED_IDLE attualmente in esecuzione.
SCHED_RR è un semplice miglioramento di SCHED_FIFO. Tutto quanto sopra descritto per SCHED_FIFO si applica anche a SCHED_RR,
La priorità dei processi in tempo reale viene definita priorità statica che non può essere modificata dal kernel. Pertanto, i valori PR positivi possono essere trattati come priorità dinamica per i processi non in tempo reale ( SCHED_OTHER , SCHED_BATCH ) e il valore PR negativo come priorità statica per i processi in tempo reale ( SCHED_RR , SCHED_FIFO ).
Ho anche provato a correre nice -n 10 chrt -r 50 top
(e chrt -r 50 nice -n 10 top
). Il valore NI era 10, ma il PR era ancora -51 . Quindi sembra che il valore NI non influisca sulla priorità dei processi SCHED_RR . Ciò corrisponde al manuale di setpriority :
Qualsiasi processo o thread che utilizza SCHED_FIFO o SCHED_RR non deve essere influenzato da una chiamata a setpriority (). Questo non è considerato un errore. Un processo che successivamente ritorna a SCHED_OTHER non deve avere la sua priorità influenzata da tale chiamata setpriority ().
Una nota divertente. Se esegui chrt -r 99 top
, vedrai il valore RT anziché un numero nella colonna PR .
PID UTENTE PR NI VIRT RES SHR S% CPU% MEM TIME + COMANDO
28489 radice RT 0 2852 1200 896 R 0 0,1 0: 00,01 superiore
Non penso che questo significhi che il processo è ora speciale. Penso che questo significhi che la parte superiore non stampa -100 perché la stampa richiederebbe 4 caratteri.
Puoi anche usare htop invece di top in tutti gli esempi che possono essere più convenienti. ps -l
può essere utilizzato anche, ma il punto base che separa le priorità in tempo reale e non in tempo reale non è 0, ma 60, quindi nice -n -20 ps -l
verrà stampato
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 28983 28804 0 60-20-1176 - punti / 6 00:00:00 ps