Diferença entre bom valor e prioridade na saída superior

9

top , por padrão, lista as duas colunas. Estou curioso para saber qual é a diferença. Eu verifiquei as páginas do manual e não consigo descobrir:

Prioridade:

   h: PR  --  Priority
      The priority of the task.

Bom 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.

Eu entendo que Bom valor está relacionado à fila do agendador de CPU do Kernel; então o que Prioridade indica? Algo sobre I / O, talvez?

    
por Belmin Fernandez 26.10.2010 / 22:41

3 respostas

7

O bom valor é um mecanismo "global", enquanto a prioridade é relevante para o alternador de tarefas agora .

    
por 26.10.2010 / 22:44
18

A diferença é que PR é uma prioridade real de um processo no momento dentro do kernel e NI é apenas uma dica para o kernel qual a prioridade do processo deveria ter.

Na maioria dos casos, o valor PR pode ser calculado pela seguinte fórmula: PR = 20 + NI . Assim, o processo com afinidade 3 tem a prioridade 23 (20 + 3) e o processo com afinidade -7 tem a prioridade 13 (20 - 7). Você pode verificar o primeiro executando o comando nice -n 3 top . Ele mostrará que o processo top tem NI 3 e PR 23 . Mas para rodar nice -n -7 top na maioria dos sistemas Linux, você precisa ter privilégios de root, porque na verdade o menor valor PR é a maior prioridade real. Assim, o processo com PR 13 tem maior prioridade do que os processos com prioridade padrão PR 20 . É por isso que você precisa ser root. Mas o valor mínimo de niceness permitido para processos não-raiz pode ser configurado em /etc/security/limits.conf .

Teoricamente, o kernel pode alterar o valor de PR (mas não NI ) por si só. Por exemplo, pode reduzir a prioridade de um processo se consumir muita CPU, ou pode aumentar a prioridade de um processo se esse processo não tiver chance de ser executado por um longo tempo devido a outros processos de prioridade mais alta. Nestes casos, o valor de PR será alterado pelo kernel e NI permanecerá o mesmo, assim a fórmula "PR = 20 + NI" será não estar correto. Então o valor de NI pode ser interpretado como uma dica para o kernel que prioridade o processo deve ter, mas o kernel pode escolher a prioridade real (valor PR ) por conta própria dependendo a situação. Mas normalmente a fórmula "PR = 20 + NI" está correta.

As regras exatas de como o kernel muda de prioridade não são claras. O manual setpriority (a função que altera o bom valor) diz:

The effect of changing the nice value may vary depending on the process-scheduling algorithm in effect.

Manual do Pthread diz o seguinte:

The dynamic priority is based on the nice value (set by nice(2), setpriority(2), or sched_setattr(2)) and increased for each time quantum the thread is ready to run, but denied to run by the scheduler.

Parece que o valor PR corresponde à prioridade dinâmica.

O intervalo do valor NI é -20..19 . Assim, o valor PR pode ter os valores de 0 (20 - 20) para 39 (20 + 19). Mas está correto apenas para os processos com diretiva de agendamento padrão ( SHED_OTHER ). Também pode haver processos com as chamadas políticas de agendamento "em tempo real" . Essas políticas são SCHED_RR e SCHED_FIFO . Esses processos têm um valor PR menor que 0. Você pode verificar isso executando o comando chrt -r 1 top (precisa ser root). O processo top terá PR -2 . Você ainda pode executar chrt -r 90 top , em cujo caso o processo top terá PR -91 .

Parece que para SCHED_RR processar o valor PR pode ser calculado pela fórmula:

PR = - 1 - sched_rr_priority .

Assim, um processo SCHED_RR tem pelo menos PR -1 o que significa que qualquer processo SCHED_RR tem prioridade mais alta do que qualquer SCHED_OTHER . Isso corresponde ao manual pthread:

SCHED_FIFO can be used only with static priorities higher than 0, which means that when a SCHED_FIFO threads becomes runnable, it will always immediately preempt any currently running SCHED_OTHER, SCHED_BATCH, or SCHED_IDLE thread.

SCHED_RR is a simple enhancement of SCHED_FIFO. Everything described above for SCHED_FIFO also applies to SCHED_RR,

A prioridade dos processos em tempo real é referida como prioridade estática que não pode ser alterada pelo kernel. Assim, os valores PR positivos podem ser tratados como prioridade dinâmica para processos não-em tempo real ( SCHED_OTHER , SCHED_BATCH ) e PR valor como prioridade estática para processos em tempo real ( SCHED_RR , SCHED_FIFO ).

Eu também tentei executar nice -n 10 chrt -r 50 top (e chrt -r 50 nice -n 10 top ). O valor NI era 10, mas o PR ainda era -51 . Portanto, parece que o valor NI não afeta a prioridade dos processos SCHED_RR . Isso corresponde ao manual setpriority :

Any processes or threads using SCHED_FIFO or SCHED_RR shall be unaffected by a call to setpriority(). This is not considered an error. A process which subsequently reverts to SCHED_OTHER need not have its priority affected by such a setpriority() call.

Uma nota engraçada. Se você executar chrt -r 99 top , verá o valor RT em vez de um número na coluna PR .

  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

Eu não acho que isso significa que o processo agora é especial. Eu acho que isso significa que top simplesmente não imprime -100 porque levaria 4 caracteres para imprimir.

Você também pode usar htop em vez de top em todos os exemplos que podem ser mais convenientes. ps -l pode ser usado também, mas o ponto base que separa prioridades em tempo real e não em tempo real não é 0, mas 60, então nice -n -20 ps -l será impresso

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
    
por 13.02.2015 / 04:26
0

Resposta curta

PR é o nível de prioridade. Quanto menor o PR, maior a prioridade do processo.

O PR é calculado da seguinte forma:

  • para processos normais: PR = 20 - NI (NI é bom e varia de -20 a 19)
  • para processos em tempo real: PR = - 1 - real_time_priority (real_time_priority varia de 1 a 99)

Longa resposta

Existem 2 tipos de processos, os normais e os tempo real Para os normais (e apenas para aqueles), nice é aplicado da seguinte forma:

Nice

A escala de "bondade" vai de -20 a 19, enquanto que -20 é a prioridade mais alta e 19 é a prioridade mais baixa. O nível de prioridade é calculado da seguinte forma:

PR = 20 + NI

Onde NI é o nível bom e PR é o nível de prioridade. Então, como podemos ver, o -20 realmente mapeia para 0, enquanto o 19 mapeia para 39.

Por padrão, um valor legal do programa é 0 bit. É possível para um usuário root almoçar programas com um valor legal especificado usando o seguinte comando:

nice -n <nice_value> ./myProgram 

Tempo real

Poderíamos ir ainda mais longe. A boa prioridade é realmente usada para programas do usuário. Enquanto a prioridade geral do UNIX / LINUX possui um intervalo de 140 valores, um valor interessante permite que o processo seja mapeado para a última parte do intervalo (de 100 a 139). Essa equação deixa os valores de 0 a 99 inacessíveis, o que corresponderá a um nível de PR negativo (de -100 a -1). Para poder acessar esses valores, o processo deve ser declarado como "tempo real".

Existem 5 políticas de agendamento em um ambiente LINUX que podem ser exibidas com o seguinte comando:

chrt -m 

Que mostrará a seguinte 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

Os processos de agendamento podem ser divididos em 2 grupos, as políticas normais de agendamento (1 a 3) e as políticas de agendamento em tempo real (4 e 5). Os processos em tempo real sempre terão prioridade sobre os processos normais. Um processo em tempo real pode ser chamado usando o seguinte comando (O exemplo é como declarar uma política SCHED_RR):

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

Para obter o valor de PR para um processo em tempo real, a seguinte equação é aplicada:

PR = -1 - rt_prior

Onde rt_prior corresponde à prioridade entre 1 e 99. Por essa razão, o processo que terá maior prioridade sobre outros processos será o chamado com o número 99.

É importante notar que, para processos em tempo real, o bom valor não é usado.

Para ver a atual "niceness" e o valor PR de um processo, o seguinte comando pode ser executado:

top

É bom notar que os processos com valor PR -51, por exemplo, correspondem a um valor em tempo real. Existem também alguns processos cujo valor PR é declarado como "rt". Este valor corresponde realmente a um valor de PR de -100.

(PS: Eu teria postado uma foto mostrando o melhor resultado, mas não tenho a reputação de fazer isso)

    
por 26.09.2018 / 12:04

Tags