La diferencia es que PR es una prioridad real de un proceso en este momento dentro del kernel y NI es solo una pista para el kernel sobre la prioridad que debe tener el proceso.
En la mayoría de los casos PR el valor se puede calcular mediante la siguiente fórmula:PR =20 + NI . Así el proceso con amabilidad 3 tiene la prioridad 23 (20 + 3) y el proceso con amabilidad -7 tiene la prioridad 13 (20 - 7). Puede verificar el primero ejecutando el comando nice -n 3 top
. Mostrará que superior el proceso tiene NI 3 y PR 23 . Pero para ejecutar nice -n -7 top
en la mayoría de los sistemas Linux, debe tener privilegios de root porque en realidad el PR más bajo el valor es la prioridad real más alta. Así el proceso con PR 13 tiene mayor prioridad que los procesos con prioridad estándar PR 20 . Por eso es necesario ser root. Pero el valor de amabilidad mínimo permitido para el proceso no raíz se puede configurar en /etc/security/limits.conf .
En teoría, el núcleo puede cambiar PR valor (pero no NI ) por sí mismo. Por ejemplo, puede reducir la prioridad de un proceso si consume demasiada CPU, o puede aumentar la prioridad de un proceso si ese proceso no tuvo oportunidad de ejecutarse durante mucho tiempo debido a otros procesos de mayor prioridad. En estos casos el PR el kernel y NI cambiarán el valor seguirá siendo el mismo, por lo que la fórmula "PR =20 + NI" no será correcto. Entonces el NI El valor puede interpretarse como una sugerencia para el kernel sobre la prioridad que debe tener el proceso, pero el kernel puede elegir la prioridad real (PR valor) por sí solo dependiendo de la situación. Pero normalmente la fórmula "PR =20 + NI" es correcto.
Las reglas exactas sobre cómo el kernel cambia la prioridad no están claras. establecer prioridad (la función que cambia el valor agradable) el manual dice:
El efecto de cambiar el valor agradable puede variar según el algoritmo de programación de procesos en vigor.
El manual de Pthread dice lo siguiente:
La prioridad dinámica se basa en el valor agradable (establecido por nice(2), setpriority(2) o sched_setattr(2)) y aumenta cada vez que el subproceso está listo para ejecutarse, pero el programador lo deniega.
Parece que PR el valor corresponde a la prioridad dinámica.
El rango del NI el valor es -20..19 . Así el PR valor puede tener los valores de 0 (20 - 20) a 39 (20 + 19). Pero es correcto solo para los procesos con política de programación predeterminada (SHED_OTHER ). También puede haber procesos con el llamado "tiempo real" políticas de programación. Estas políticas son SCHED_RR y SCHED_FIFO . Dichos procesos tienen un PR valor inferior a 0. Puede verificar esto ejecutando chrt -r 1 top
comando (necesita ser root). La parte superior el proceso tendrá PR -2 . Incluso puedes ejecutar chrt -r 90 top
en cuyo caso la superior el proceso tendrá PR -91 .
Parece que para SCHED_RR procesa el PR el valor se puede calcular mediante la fórmula:
PR =- 1 - sched_rr_priority .
Por lo tanto, un SCHED_RR el proceso tiene al menos PR -1 lo que significa que cualquier SCHED_RR el proceso tiene mayor prioridad que cualquier SCHED_OTHER . Esto corresponde al manual pthread:
SCHED_FIFO solo se puede usar con prioridades estáticas superiores a 0, lo que significa que cuando un subproceso SCHED_FIFO se vuelve ejecutable, siempre se adelantará inmediatamente a cualquier subproceso SCHED_OTHER, SCHED_BATCH o SCHED_IDLE que se esté ejecutando actualmente.
SCHED_RR es una mejora simple de SCHED_FIFO. Todo lo descrito anteriormente para SCHED_FIFO también se aplica a SCHED_RR,
La prioridad de los procesos en tiempo real se conoce como prioridad estática que el núcleo no puede cambiar. Muy positivo PR los valores se pueden tratar como prioridad dinámica para no en tiempo real (SCHED_OTHER , SCHED_BATCH ) procesos y PR negativos valor como prioridad estática para procesos en tiempo real (SCHED_RR , SCHED_FIFO ).
También traté de ejecutar nice -n 10 chrt -r 50 top
(y chrt -r 50 nice -n 10 top
). El NI el valor era 10, pero el PR todavía era -51 . Entonces parece que NI el valor no afecta la prioridad de SCHED_RR procesos. Esto corresponde a establecer prioridad manuales:
Cualquier proceso o subproceso que utilice SCHED_FIFO o SCHED_RR no se verá afectado por una llamada a setpriority(). Esto no se considera un error. Un proceso que posteriormente vuelve a SCHED_OTHER no necesita ver su prioridad afectada por tal llamada a setpriority().
Una nota divertida. Si ejecuta chrt -r 99 top
, verás RT valor en lugar de un número en PR columna.
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
No creo que esto signifique que el proceso ahora es especial. Creo que esto significa que arriba simplemente no imprima -100 porque se necesitarían 4 caracteres para imprimir.
También puede usar htop en lugar de superior en todos los ejemplos que puede ser más conveniente. ps -l
también se puede usar, pero el punto base que separa las prioridades en tiempo real y las que no son en tiempo real no es 0, sino 60, por lo que nice -n -20 ps -l
imprimirá
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
El buen valor es un mecanismo "global", mientras que la prioridad es relevante para el conmutador de tareas ahora mismo .