arriba , por defecto, enumera ambas columnas. Tengo curiosidad por saber cuál es la diferencia. Revisé las páginas del manual y no puedo entenderlo:
Prioridad:
h: PR -- Priority
The priority of the task.
Buen valor:
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.
Entiendo que el valor de Nice está relacionado con la cola del programador de CPU del Kernel; entonces, ¿qué indica Prioridad ? ¿Algo relacionado con E / S tal vez?
La diferencia es que PR es una prioridad real de un proceso en este momento dentro del núcleo y NI es solo una pista para el núcleo sobre la prioridad que debería tener el proceso.
En la mayoría de los casos, el valor de PR puede calcularse mediante la siguiente fórmula: PR = 20 + NI . Por lo tanto, 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 el proceso superior tiene NI 3 y PR 23 . Pero para ejecutarsenice -n -7 top
en la mayoría de los sistemas Linux necesita tener privilegios de root porque en realidad el valor PR más bajo es la prioridad real más alta. Por lo tanto, el proceso con PR 13 tiene mayor prioridad que los procesos con prioridad estándar PR 20. Es por eso que necesitas ser root. Pero el valor de bondad mínimo permitido para el proceso no root se puede configurar en /etc/security/limits.conf .Teóricamente, el núcleo puede cambiar el valor de PR (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 valor de PR será cambiado por el núcleo y NI seguirá siendo el mismo, por lo que la fórmula "PR = 20 + NI" no será correcta. Por lo tanto, el valor de NI puede interpretarse como una pista para el núcleo sobre la prioridad que debe tener el proceso, pero el núcleo puede elegir la prioridad real ( valor de PR ) por sí mismo dependiendo de la situación. Pero por lo general la fórmula"PR = 20 + NI" es correcto.
Las reglas exactas de cómo el núcleo cambia la prioridad no están claras. El manual setpriority (la función que cambia un buen valor) dice:
El manual de Pthread dice lo siguiente:
Parece que el valor PR corresponde a la prioridad dinámica.
El rango del valor de NI es -20..19 . Por lo tanto, el valor PR 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 las llamadas políticas de programación "en tiempo real" . Estas políticas son SCHED_RR y SCHED_FIFO . Dichos procesos tienen un valor PR inferior a 0. Puede verificar esto ejecutando el
chrt -r 1 top
comando (debe ser root). El proceso superior tendrá PR -2 . Incluso puedes correrchrt -r 90 top
en cuyo caso la parte superiorEl proceso tendrá PR -91 .Parece que para los procesos SCHED_RR el valor de PR puede calcularse mediante la fórmula:
PR = - 1 - sched_rr_priority .
Por lo tanto, un proceso SCHED_RR tiene al menos PR -1, lo que significa que cualquier proceso SCHED_RR tiene mayor prioridad que cualquier SCHED_OTHER . Esto corresponde al manual de pthread:
La prioridad de los procesos en tiempo real se conoce como prioridad estática que el núcleo no puede cambiar. Por lo tanto, los valores PR positivos pueden tratarse como prioridad dinámica para procesos que no son en tiempo real ( SCHED_OTHER , SCHED_BATCH ) y el valor PR negativo como prioridad estática para procesos en tiempo real ( SCHED_RR , SCHED_FIFO ).
También intenté correr
nice -n 10 chrt -r 50 top
(ychrt -r 50 nice -n 10 top
). El valor de NI fue 10, pero el PR aún fue -51 . Entonces parece que el valor de NI no afecta la prioridad de los procesos SCHED_RR . Esto corresponde al manual setpriority :Una nota graciosa Si ejecuta
chrt -r 99 top
, verá el valor RT en lugar de un número en la columna PR .No creo que esto signifique que el proceso ahora sea especial. Creo que esto significa que la parte superior simplemente no imprime -100 porque tomaría 4 caracteres para imprimir.
También puede usar htop en lugar de top en todos los ejemplos que pueden ser más convenientes.
ps -l
también se puede usar, pero el punto base que separa las prioridades en tiempo real y no en tiempo real no es 0, sino 60, por lo quenice -n -20 ps -l
se imprimiráfuente
Respuesta corta
PR es el nivel de prioridad. Cuanto menor sea el PR, mayor será la prioridad del proceso.
PR se calcula de la siguiente manera:
Respuesta larga
Hay 2 tipos de procesos, los normales y el tiempo real. Para los normales (y solo para esos), nice se aplica de la siguiente manera:
agradable
La escala de "amabilidad" va de -20 a 19, mientras que -20 es la prioridad más alta y 19 la prioridad más baja. El nivel de prioridad se calcula de la siguiente manera:
PR = 20 + NI
Donde NI es el nivel agradable y PR es el nivel de prioridad. Como podemos ver, el -20 en realidad se asigna a 0, mientras que el 19 se asigna a 39.
Por defecto, el valor agradable de un programa es de 0 bits, es posible que un usuario root almuerce programas con un valor agradable especificado utilizando el siguiente comando:
Tiempo real
Podríamos ir aún más lejos. La buena prioridad se usa realmente para los programas de usuario. Mientras que la prioridad general de UNIX / LINUX tiene un rango de 140 valores, el valor agradable permite que el proceso se asigne a la última parte del rango (de 100 a 139). Esta ecuación deja inalcanzables los valores de 0 a 99, lo que corresponderá a un nivel PR negativo (de -100 a -1). Para poder acceder a esos valores, el proceso debe establecerse como "en tiempo real".
Hay 5 políticas de programación en un entorno LINUX que se pueden mostrar con el siguiente comando:
Lo que mostrará la siguiente lista:
Los procesos de programación podrían dividirse en 2 grupos, las políticas de programación normales (1 a 3) y las políticas de programación en tiempo real (4 y 5). Los procesos en tiempo real siempre tendrán prioridad sobre los procesos normales. Se puede llamar a un proceso en tiempo real utilizando el siguiente comando (el ejemplo es cómo declarar una política SCHED_RR):
Para obtener el valor PR para un proceso en tiempo real, se aplica la siguiente ecuación:
PR = -1 - rt_prior
Donde rt_prior corresponde a la prioridad entre 1 y 99. Por esa razón, el proceso que tendrá mayor prioridad sobre otros procesos será el llamado con el número 99.
Es importante tener en cuenta que para los procesos en tiempo real, no se utiliza el valor agradable.
Para ver la "simpatía" actual y el valor de PR de un proceso, se puede ejecutar el siguiente comando:
Es bueno tener en cuenta que los procesos con valor PR -51, por ejemplo, corresponden a un valor en tiempo real. También hay algunos procesos cuyo valor PR se indica como "rt". Este valor corresponde en realidad a un valor PR de -100.
(PD: Hubiera publicado una imagen que muestra el mejor resultado, pero no tengo la reputación para hacerlo)
fuente