Diferencia entre buen valor y prioridad en el resultado superior

Diferencia entre buen valor y prioridad en el resultado superior

arriba, de forma predeterminada, enumera ambas columnas. Tengo curiosidad por saber cuál es la diferencia. Revisé las páginas de 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 queBuen valorestá relacionado con la cola del programador de la CPU del Kernel; entonces que hacePrioridad¿indicar? ¿Quizás algo relacionado con E/S?

Respuesta1

El buen valor es un mecanismo "global", mientras que la prioridad es relevante para el conmutador de tareas.ahora mismo.

Respuesta2

La diferencia es querelaciones públicases una prioridad real de un proceso en este momento dentro del kernel yNIes sólo una pista para el núcleo sobre cuál debe ser la prioridad que debe tener el proceso.

En la mayoría de los casosrelaciones públicasEl 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). Puedes comprobar el primero ejecutando el comando nice -n 3 top. Mostrará quearribael proceso tieneNI 3yPR 23. Pero para ejecutar nice -n -7 topla mayoría de los sistemas Linux es necesario tener privilegios de root porque, en realidad, los niveles más bajosrelaciones públicasEl valor es la mayor prioridad real. Así el proceso conPR 13tiene mayor prioridad que los procesos con prioridad estándarPR 20. Por eso necesitas ser root. Pero el valor mínimo de amabilidad permitido para procesos no raíz se puede configurar en/etc/security/limits.conf.

En teoría, el núcleo puede cambiar.relaciones públicasvalor (pero noNI) 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 elrelaciones públicasEl valor será cambiado por el kernel yNIseguirá siendo el mismo, por lo tanto la fórmula"PR = 20 + NI"no será correcto. Entonces elNIEl valor se puede interpretar como una pista para el núcleo sobre cuál debe ser la prioridad que debe tener el proceso, pero el núcleo puede elegir la prioridad real (relaciones públicasvalor) 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.fijar 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 vigente.

manual de hilodice lo siguiente:

La prioridad dinámica se basa en el valor nice (establecido por nice(2), setpriority(2) o sched_setattr(2)) y aumenta cada vez que el hilo está listo para ejecutarse, pero el programador le niega la ejecución.

Parece querelaciones públicasEl valor corresponde a la prioridad dinámica.

El rango de laNIel valor es-20..19. Por lo tanto, larelaciones públicasEl valor puede tener los valores de0(20 - 20) a39(20+19). Pero es correcto sólo para los procesos con política de programación predeterminada (SHED_OTHER). También puede haber procesos con los llamados"tiempo real"políticas de programación. Estas políticas sonSCHED_RRySCHED_FIFO. Tales procesos tienen unrelaciones públicasvalor menor que 0. Puede verificar esto ejecutando chrt -r 1 topel comando (debe ser root). Elarribael proceso tendráPR-2. Incluso puedes ejecutar, chrt -r 90 topen cuyo caso elarribael proceso tendráPR-91.

Parece que paraSCHED_RRprocesa elrelaciones públicasEl valor se puede calcular mediante la fórmula:

PR = - 1 - sched_rr_priority.

Así unSCHED_RREl proceso tiene al menosPR-1lo que significa que cualquierSCHED_RRproceso tiene mayor prioridad que cualquierSCHED_OTHER. Esto corresponde al manual de 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 denomina prioridad estática y el núcleo no puede cambiarla. tan positivorelaciones públicasLos valores se pueden tratar como prioridad dinámica para tiempo no real (SCHED_OTHER,SCHED_BATCH) procesos y negativosrelaciones públicasvalor como prioridad estática para procesos en tiempo real (SCHED_RR,SCHED_FIFO).

También intenté ejecutar nice -n 10 chrt -r 50 top(y chrt -r 50 nice -n 10 top). ElNIEl valor era 10, pero elrelaciones públicastodavía estaba-51. Entonces parece queNIEl valor no afecta la prioridad deSCHED_RRprocesos. Esto corresponde afijar prioridadmanual:

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 dicha llamada a setpriority().

Una nota divertida. Si corres chrt -r 99 top, verásRTvalor en lugar de un número enrelaciones públicascolumna.

  PID USUARIO PR NI VIRT RES SHR S %CPU %MEM TIME+ COMANDO
28489 raíz RT 0 2852 1200 896 R 0 0.1 0:00.01 arriba

No creo que esto signifique que el proceso sea ahora especial. Creo que esto significa quearribasimplemente no imprimas-100porque se necesitarían 4 caracteres para imprimir.

También puedes usararribaen lugar dearribaen todos los ejemplos cuál puede ser más conveniente. ps -lTambién se puede utilizar, pero el punto base que separa las prioridades en tiempo real y no real no es 0, sino 60, por lo que nice -n -20 ps -lse imprimirá.

FS UID PID PPID C PRI NI DIRECCIÓN SZ WCHAN TTY TIEMPO CMD
4 R 0 28983 28804 0 60 -20 - 1176 - puntos/6 00:00:00 ps

Respuesta3

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:

  • para procesos normales: PR = 20 + NI (NI es bueno y oscila entre -20 y 19)
  • para procesos en tiempo real: PR = - 1 - real_time_priority (real_time_priority varía de 1 a 99)

Respuesta larga

Hay 2 tipos de procesos, elnormalunos y eltiempo real Para los normales (y sólo para esos), nice se aplica de la siguiente manera:

Lindo

La escala de "amabilidad" va de -20 a 19, donde -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.

De forma predeterminada, el valor agradable de un programa es de 0 bits. Es posible que un usuario root inicie programas con un valor agradable especificado utilizando el siguiente comando:

nice -n <nice_value> ./myProgram 

Tiempo real

Podríamos ir aún más lejos. La prioridad agradable se utiliza en realidad para 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 de PR negativo (de -100 a -1). Para poder acceder a esos valores, el proceso debe declararse como "en tiempo real".

Hay 5 políticas de programación en un entorno LINUX que se pueden mostrar con el siguiente comando:

chrt -m 

El cual mostrará la siguiente lista:

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

Los procesos de programación se podrían dividir 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 podría llamar a un proceso en tiempo real usando el siguiente comando (el ejemplo es cómo declarar una política SCHED_RR):

chrt --rr <priority between 1-99> ./myProgram

Para obtener el valor de 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 ese motivo el proceso que tendrá mayor prioridad sobre otros procesos será el llamado con el número 99.

Es importante tener en cuenta que para procesos en tiempo real, no se utiliza el valor agradable.

Para ver la "amabilidad" actual y el valor PR de un proceso, se puede ejecutar el siguiente comando:

top

Es bueno tener en cuenta que los procesos con un valor PR -51, por ejemplo, corresponden a un valor en tiempo real. También hay algunos procesos cuyo valor PR se indica como "rt". En realidad, este valor corresponde a un valor PR de -100.

(PD: habría publicado una foto mostrando el mejor resultado, pero no tengo la reputación para hacerlo)

información relacionada