A coluna 'PRI' do 'ps' é inconsistente com man pages

3

Estou tentando entender como as prioridades de programação funcionam no linux. Aqui está o que eu tenho:

  • O kernel usa um valor de prioridade para cada processo, que varia de 0 a 139. Quanto menor o número, maior a prioridade do processo.
  • Valores de prioridade de 0 a 99 são reservados, todos os processos de espaço do usuário têm prioridade de 100 a 139.
  • O Linux fornece a interface nice , que é a prioridade exposta e modificável pelo usuário. O valor nice varia de -20 a 19 e é mapeado para as prioridades de 100 a 139. Assim como no valor de prioridade, quanto menor o valor de nice , maior a prioridade do processo.

Minha pergunta agora é: O que a coluna PRI de ps indica?

A página man de ps diz:

   pri         PRI       priority of the process.  Higher number means
                         lower priority.

Mas o valor varia de 0 a 39, e eu determinei empiricamente que é igual a 19 - nice .

É impossível, considerando a relação, que tanto nice quanto a prioridade mostrada na coluna PRI satisfaçam "número mais alto significa menor prioridade".

O que estou perdendo?

Exemplo mostrando este comportamento:

root@kali:~# ps -ao pid,comm,pri,nice
  PID COMMAND         PRI  NI
 6153 cat              19   0
 (···)
root@kali:~# renice -n -10 -p 6153
6153 (process ID) old priority 0, new priority -10
root@kali:~# ps -ao pid,comm,pri,nice
  PID COMMAND         PRI  NI
 6153 cat              29 -10
 (···)
    
por Adrià Rico Blanes 16.11.2018 / 17:45

1 resposta

4

O PRI de ps -o pri é 39 - priority , em que priority é o 18º campo de /proc/PID/stat .

Se você quiser o campo não manipulado de proc/PID/stat , poderá obtê-lo com ps -o priority .

Se você quiser a prioridade real , poderá obtê-la com ps -o pri_baz .

Outras manchetes interessantes desse valor podem ser obtidas com ps -o pri_foo , ps -o pri_bar e ps -o opri .

Eu não estou brincando. Você pode ver a fonte aqui .

Nota sobre /proc/PID/stat :

O campo de prioridade (18º) em /proc/PID/stat é definido pelo kernel em fs/proc/array.c para task_struct->prio - 100 (através de task_prio() ; MAX_RT_PRIO é definido como 100 ).

    
por 16.11.2018 / 22:07

Tags