차이점은 PR 은 커널 내부에서 프로세스의 우선 순위이며 NI 는 프로세스 우선 순위에 대한 힌트입니다.
대부분의 경우 PR 값은 다음 공식으로 계산할 수 있습니다 : PR = 20 + NI . 따라서 niceness 3 인 프로세스의 우선 순위는 23 (20 + 3)이고 niceness -7 인 프로세스의 우선 순위는 13 (20-7)입니다. command를 실행하여 첫 번째를 확인할 수 있습니다 nice -n 3 top
. 최상위 프로세스에 NI 3 및 PR 23 이 있음을 보여줍니다 . 그러나 nice -n -7 top
대부분의 Linux 시스템에서 실행 하려면 실제로 PR 값이 낮을 수록 실제 우선 순위가 높기 때문에 루트 권한이 필요합니다 . 따라서 PR 13의 프로세스는 표준 우선 순위 PR 20의 프로세스보다 우선 순위가 높습니다.. 그래서 루트가되어야합니다. 그러나 비 루트 프로세스에 허용되는 최소 niceness 값은 /etc/security/limits.conf 에서 구성 할 수 있습니다 .
이론적으로 커널은 PR 값 ( NI는 아님) 자체를 변경할 수 있습니다 . 예를 들어 CPU를 너무 많이 사용하면 프로세스의 우선 순위가 낮아 지거나 우선 순위가 높은 다른 프로세스로 인해 프로세스가 오랫동안 실행될 기회가 없으면 프로세스의 우선 순위가 높아질 수 있습니다. 이 경우 PR 값은 커널에 의해 변경되고 NI 는 동일하게 유지되므로 공식 "PR = 20 + NI" 는 정확하지 않습니다. 따라서 NI 값은 프로세스의 우선 순위를 커널에 대한 힌트로 해석 할 수 있지만 커널은 상황에 따라 자체적으로 우선 순위 ( PR 값)를 선택할 수 있습니다 . 그러나 보통 공식"PR = 20 + NI" 가 정확합니다.
커널이 우선 순위를 변경하는 정확한 규칙은 명확하지 않습니다. setpriority (좋은 값을 변경하는 기능) 매뉴얼은 다음과 같이 말합니다.
nice 값을 변경하는 효과는 프로세스 스케줄링 알고리즘에 따라 달라질 수 있습니다.
Pthread 매뉴얼 은 다음과 같이 말합니다.
동적 우선 순위는 nice 값 (nice (2), setpriority (2) 또는 sched_setattr (2)로 설정)을 기반으로하며 스레드가 실행될 준비가되었지만 스케줄러에 의해 실행이 거부 될 때마다 증가합니다.
PR 값은 동적 우선 순위에 해당하는 것으로 보입니다 .
NI 값 의 범위 는 -20..19 입니다. 따라서 PR 값은 0 (20-20)에서 39 (20 + 19) 사이 의 값을 가질 수 있습니다 . 그러나 기본 스케줄링 정책 ( SHED_OTHER )이 있는 프로세스에만 해당됩니다 . 소위 "실시간" 스케줄링 정책 이있는 프로세스도있을 수 있습니다 . 이러한 정책은 SCHED_RR 및 SCHED_FIFO 입니다. 이러한 프로세스의 PR 값은 0보다 작습니다. chrt -r 1 top
명령 을 실행 하여 (루트 여야 함) 이를 확인할 수 있습니다 . 최고 과정이있을 것이다 PR -2 . chrt -r 90 top
어떤 경우에도 상단을 달릴 수 있습니다.프로세스는 PR -91 입니다.
을위한 것으로 보인다 SCHED_RR가 처리하는 PR의 값은 공식에 의해 계산 될 수있다 :
PR =-1-sched_rr_priority .
따라서 SCHED_RR의 프로세스는 적어도 갖는 PR -1 어떤 것을 의미 SCHED_RR의 프로세스는 임의의보다 높은 우선 순위를 갖는다 SCHED_OTHER을 . 이것은 pthread 매뉴얼에 해당합니다 :
SCHED_FIFO는 0보다 높은 정적 우선 순위에서만 사용할 수 있습니다. 즉, SCHED_FIFO 스레드가 실행 가능할 때 항상 현재 실행중인 SCHED_OTHER, SCHED_BATCH 또는 SCHED_IDLE 스레드를 즉시 선점합니다.
SCHED_RR은 SCHED_FIFO의 간단한 향상입니다. SCHED_FIFO에 대해 위에서 설명한 모든 내용은 SCHED_RR에도 적용됩니다.
실시간 프로세스의 우선 순위는 커널이 변경할 수없는 정적 우선 순위라고합니다. 따라서 양의 PR 값은 비 실시간 ( SCHED_OTHER , SCHED_BATCH ) 프로세스에 대한 동적 우선 순위로 처리되고 음의 PR 값은 실시간 프로세스에 대한 정적 우선 순위 ( SCHED_RR , SCHED_FIFO )로 처리 될 수 있습니다.
나는 또한 nice -n 10 chrt -r 50 top
(및 chrt -r 50 nice -n 10 top
) 를 실행하려고했습니다 . NI의 값은 10했지만, PR은 여전히 -51 . 따라서 NI 값은 SCHED_RR 프로세스의 우선 순위에 영향을 미치지 않는 것 같습니다 . 이것은 setpriority 매뉴얼에 해당합니다 .
SCHED_FIFO 또는 SCHED_RR을 사용하는 모든 프로세스 또는 스레드는 setpriority ()를 호출해도 영향을받지 않습니다. 이것은 오류로 간주되지 않습니다. 이후에 SCHED_OTHER로 복귀하는 프로세스는 그러한 setpriority () 호출의 영향을받는 우선 순위를 가질 필요가 없습니다.
재미있는 메모 하나. 를 실행 chrt -r 99 top
하면 PR 열에 숫자 대신 RT 값 이 표시 됩니다.
PID 사용자 PR NI VIRT RES SHR S % CPU % MEM TIME + 명령
28489 루트 RT 0 2852 1200896 R 0 0.1 0 : 00.01 위로
나는 이것이 프로세스가 이제 특별하다는 것을 의미한다고 생각하지 않습니다. 이것은 상단에 인쇄 하는 데 4 문자가 필요하기 때문에 -100을 인쇄하지 않는 것을 의미한다고 생각합니다 .
더 편리한 모든 예제에서 top 대신 htop 을 사용할 수도 있습니다 . 또한 사용할 수 있지만 실시간 우선 순위와 비 실시간 우선 순위를 구분하는 기준은 0이 아니라 60이므로 인쇄됩니다.ps -l
nice -n -20 ps -l
FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY 시간 CMD
4 R 0 28983 28804 60-20-1176-pts / 6 00:00:00 ps