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

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

principal, por padrão, lista ambas as colunas. Estou curioso para saber qual é a diferença. Eu verifiquei as páginas de 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 entendi aquiloBom valorestá relacionado à fila do escalonador de CPU do Kernel; então o que fazPrioridadeindicar? Algo relacionado a E/S, talvez?

Responder1

O valor legal é um mecanismo "global", enquanto a prioridade é relevante para o alternador de tarefasagora mesmo.

Responder2

A diferença é queRPé uma prioridade real de um processo no momento dentro do kernel eINé apenas uma dica para o kernel qual a prioridade que o processo deve ter.

Na maioria dos casosRPo valor pode ser calculado pela seguinte fórmula:PR = 20 + NI. Assim, o processo com gentileza 3 tem prioridade 23 (20 + 3) e o processo com gentileza -7 tem prioridade 13 (20 - 7). Você pode verificar o primeiro executando o comando nice -n 3 top. Isso vai mostrar queprincipalprocesso temNI 3ePR 23. Mas para rodar nice -n -7 topna maioria dos sistemas Linux você precisa ter privilégios de root porque na verdade o menorRPvalor é a prioridade real mais alta. Assim o processo comPR 13tem prioridade mais alta do que processos com prioridade padrãoPR 20. É por isso que você precisa ser root. Mas o valor mínimo de gentileza permitido para processos não-root pode ser configurado em/etc/security/limits.conf.

Teoricamente, o kernel pode mudarRPvalor (mas nãoIN) por si próprio. 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 período devido a outros processos de prioridade mais alta. Nestes casos oRPo valor será alterado pelo kernel eINpermanecerá a mesma, portanto a fórmula"PR = 20 + NI"não estará correto. Então oINvalor pode ser interpretado como uma dica para o kernel qual a prioridade que o processo deve ter, mas o kernel pode escolher a prioridade real (RPvalor) por si só, dependendo da situação. Mas geralmente a fórmula"PR = 20 + NI"está correto.

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

O efeito da alteração do valor legal pode variar dependendo do algoritmo de agendamento de processo em vigor.

Manual do Pthreaddiz o seguinte:

A prioridade dinâmica é baseada no valor nice (definido por nice(2), setpriority(2) ou sched_setattr(2)) e aumentada para cada quantum de tempo em que o thread está pronto para ser executado, mas a execução foi negada pelo agendador.

Parece queRPo valor corresponde à prioridade dinâmica.

O alcance doINo valor é-20..19. Assim, oRPvalor pode ter os valores de0(20 - 20) para39(20 + 19). Mas é correto apenas para os processos com política de escalonamento padrão (SHED_OTHER). Também pode haver processos com os chamados"tempo real"políticas de agendamento. Estas políticas sãoSCHED_RReSCHED_FIFO. Tais processos têm umRPvalor menor que 0. Você pode verificar isso executando chrt -r 1 topo comando (precisa ser root). Oprincipalprocesso teráRP -2. Você ainda pode executar, chrt -r 90 topnesse caso oprincipalprocesso teráPR-91.

Parece que paraSCHED_RRprocessa oRPo valor pode ser calculado pela fórmula:

PR = - 1 - sched_rr_priority.

Assim umSCHED_RRprocesso tem pelo menosRP -1o que significa que qualquerSCHED_RRprocesso tem maior prioridade do que qualquerSCHED_OTHER. Isso corresponde ao manual do pthread:

SCHED_FIFO pode ser usado apenas com prioridades estáticas superiores a 0, o que significa que quando um encadeamento SCHED_FIFO se tornar executável, ele sempre interromperá imediatamente qualquer encadeamento SCHED_OTHER, SCHED_BATCH ou SCHED_IDLE em execução no momento.

SCHED_RR é um aprimoramento simples de SCHED_FIFO. Tudo descrito acima para SCHED_FIFO também se aplica a SCHED_RR,

A prioridade dos processos em tempo real é referida como prioridade estática que não pode ser alterada pelo kernel. Tão positivoRPos valores podem ser tratados como prioridade dinâmica para não tempo real (SCHED_OTHER,SCHED_BATCH) processos e negativosRPvalor 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). OINo valor era 10, mas oRPainda era-51. Então parece queINo valor não afeta a prioridade deSCHED_RRprocessos. Isto corresponde adefinir prioridademanual:

Quaisquer processos ou threads usando SCHED_FIFO ou SCHED_RR não serão afetados por uma chamada para setpriority(). Isso não é considerado um erro. Um processo que posteriormente reverte para SCHED_OTHER não precisa ter sua prioridade afetada por tal chamada setpriority().

Uma nota engraçada. Se você correr chrt -r 99 top, veráTRvalor em vez de um número emRPcoluna.

  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28489 raiz RT 0 2852 1200 896 R 0 0,1 0:00,01 topo

Não creio que isso signifique que o processo agora seja especial. Eu acho que isso significa queprincipalsó não imprima-100porque seriam necessários 4 caracteres para imprimir.

Você também pode usarhtopem vez deprincipalem todos os exemplos que podem ser mais convenientes. ps -ltambém pode ser usado, mas o ponto base que separa as prioridades em tempo real e não em tempo real não é 0, mas 60, então nice -n -20 ps -lserá impresso

FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TEMPO CMD
4 R 0 28983 28804 0 60 -20 - 1176 - pontos/6 00:00:00 PS

Responder3

Resposta curta

PR é o nível de prioridade. Quanto menor o PR, maior será 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)

Resposta longa

Existem 2 tipos de processos, onormalos e ostempo real Para os normais (e somente para esses), o nice é aplicado da seguinte forma:

Legal

A escala de “gentileza” vai de -20 a 19, sendo -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 agradável e PR é o nível prioritário. Como podemos ver, -20 na verdade é mapeado para 0, enquanto 19 é mapeado para 39.

Por padrão, o valor legal de um 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 é, na verdade, usada para programas de usuário. Enquanto a prioridade geral do UNIX/LINUX tem um intervalo de 140 valores, o valor agradável permite que o processo seja mapeado para a última parte do intervalo (de 100 a 139). Esta equação deixa inalcançáveis ​​os valores de 0 a 99 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 escalonamento podem ser divididos em 2 grupos, as políticas de escalonamento normais (1 a 3) e as políticas de escalonamento em tempo real (4 e 5). Os processos em tempo real terão sempre prioridade sobre os processos normais. Um processo em tempo real poderia 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 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 isso o processo que terá maior prioridade sobre os demais processos será aquele chamado com o número 99.

É importante observar que para processos em tempo real o valor nice não é utilizado.

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

top

É bom observar que 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”. Na verdade, esse valor corresponde a um valor PR de -100.

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

informação relacionada