La differenza è che PR è una vera priorità di un processo al momento all'interno del kernel e NI è solo un suggerimento per il kernel sulla priorità che dovrebbe avere il processo.
Nella maggior parte dei casi PR valore può essere calcolato con la seguente formula:PR =20 + NI . Quindi il processo con gentilezza 3 ha priorità 23 (20 + 3) e il processo con gentilezza -7 ha priorità 13 (20 - 7). Puoi controllare il primo eseguendo il comando nice -n 3 top
. Mostrerà quel alto il processo ha NI 3 e PR 23 . Ma per eseguire nice -n -7 top
nella maggior parte dei sistemi Linux è necessario disporre dei privilegi di root perché in realtà il PR inferiore value è la priorità effettiva più alta. Così il processo con PR 13 ha una priorità maggiore 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 PR value (ma non NI ) da solo. Ad esempio, può ridurre la priorità di un processo se consuma troppa CPU o può aumentare la priorità di un processo se quel processo non ha avuto la possibilità di essere eseguito per molto tempo a causa di altri processi con priorità più elevata. In questi casi il PR il valore verrà modificato dal kernel e da NI rimarrà lo stesso, quindi la formula "PR =20 + NI" non sarà corretto. Quindi il NI value può essere interpretato come suggerimento per il kernel quale priorità dovrebbe avere il processo, ma il kernel può scegliere la priorità reale (PR valore) da solo a seconda della situazione. Ma di solito la formula "PR =20 + NI" è corretto.
Le regole esatte su come il kernel cambia la priorità non sono chiare. imposta priorità (la funzione che cambia bel valore) il manuale dice:
L'effetto della modifica del valore nice 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 nice (impostato da nice(2), setpriority(2) o sched_setattr(2)) e viene aumentata ogni volta che il thread è pronto per essere eseguito, ma viene negato dallo scheduler.
Sembra che PR il valore corrisponde alla priorità dinamica.
L'intervallo di NI il valore è -20..19 . Così il PR value può avere i valori da 0 (20 - 20) a 39 (20+19). Ma è corretto solo per i processi con criteri di pianificazione predefiniti (SHED_OTHER ). Potrebbero esserci anche processi con il cosiddetto "tempo reale" politiche di programmazione. Questi criteri sono SCHED_RR e SCHED_FIFO . Tali processi hanno un PR valore minore di 0. Puoi verificarlo eseguendo chrt -r 1 top
comando (è necessario essere root). La cima il processo avrà PR -2 . Puoi anche eseguire chrt -r 90 top
nel qual caso il top il processo avrà PR -91 .
Sembra che per SCHED_RR elabora la PR il valore può essere calcolato con la formula:
PR =- 1 - sched_rr_priority .
Quindi un SCHED_RR processo ha almeno PR -1 il che significa che qualsiasi SCHED_RR il processo ha una priorità maggiore rispetto a qualsiasi SCHED_OTHER . 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, prevale sempre immediatamente su 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 è indicata come priorità statica che non può essere modificata dal kernel. Quindi un PR positivo i valori possono essere trattati come priorità dinamica per file non in tempo reale (SCHED_OTHER , SCHED_BATCH ) processi e PR negativi valore come priorità statica per i processi in tempo reale (SCHED_RR , SCHED_FIFO ).
Ho anche provato a eseguire nice -n 10 chrt -r 50 top
(e chrt -r 50 nice -n 10 top
). Il NI il valore era 10, ma il PR era ancora -51 . Quindi sembra che NI il valore non influisce sulla priorità di SCHED_RR processi. Questo corrisponde a setpriority manuale:
Qualsiasi processo o thread che utilizza SCHED_FIFO o SCHED_RR non sarà influenzato da una chiamata a setpriority(). Questo non è considerato un errore. Un processo che successivamente ritorna a SCHED_OTHER non ha bisogno che la sua priorità venga influenzata da tale chiamata a setpriority().
Una nota divertente. Se esegui chrt -r 99 top
, vedrai RT valore anziché un numero in PR colonna.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28489 root RT 0 2852 1200 896 R 0 0.1 0:00.01 top
Non credo che questo significhi che il processo ora è speciale. Penso che questo significhi che top basta non stampare -100 perché ci vorrebbero 4 caratteri per la stampa.
Puoi anche usare htop invece di in alto in tutti gli esempi che possono essere più convenienti. ps -l
può anche essere usato, 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
stamperà
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 R 0 28983 28804 0 60 -20 - 1176 - pts/6 00:00:00 ps
Il bel valore è un meccanismo "globale", mentre la priorità è rilevante per il commutatore di attività in questo momento .