O bom valor é um mecanismo "global", enquanto a prioridade é relevante para o alternador de tarefas agora .
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?
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
Resposta curta
PR é o nível de prioridade. Quanto menor o PR, maior a prioridade do processo.
O PR é calculado da seguinte forma:
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)