최고의 결과물에서 좋은 가치와 우선 순위의 차이점


9

기본적으로 top 은 두 열을 모두 나열합니다. 차이점이 무엇인지 궁금합니다. 매뉴얼 페이지를 확인했는데 알아낼 수 없습니다.

우선 순위:

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

좋은 가치 :

   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.

Nice 값 은 커널의 CPU 스케줄러 대기열과 관련이 있음을 이해합니다 . 다음 무엇을 않는 우선 순위 표시? 아마도 I / O에 관한 것?

답변:



21

차이점은 PR 은 커널 내부에서 프로세스의 우선 순위이며 NI 는 프로세스 우선 순위에 대한 힌트입니다.

대부분의 경우 PR 값은 다음 공식으로 계산할 수 있습니다 : PR = 20 + NI . 따라서 niceness 3 인 프로세스의 우선 순위는 23 (20 + 3)이고 niceness -7 인 프로세스의 우선 순위는 13 (20-7)입니다. command를 실행하여 첫 번째를 확인할 수 있습니다 nice -n 3 top. 최상위 프로세스에 NI 3PR 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_RRSCHED_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 -lnice -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

이상하게도, 2 코어 하이퍼 스레드 i3에서 5 개의 무한 루프 (int main {while (1);})를 실행하면 우선 순위가 일정하게 유지됩니다. 이것은 데비안 sid 테스트에서입니다.
Vorac

1
@BelminFernandez이 답변을 "허용"하는 것이 공정하다고 생각합니다.
z0lupka

1

짧은 답변

PR은 우선 순위 수준입니다. PR이 낮을수록 프로세스의 우선 순위가 높아집니다.

PR은 다음과 같이 계산됩니다.

  • 일반 프로세스의 경우 : PR = 20-NI (NI는 훌륭하며 범위는 -20 ~ 19)
  • 실시간 프로세스의 경우 : PR =-1-real_time_priority (real_time_priority의 범위는 1-99)

긴 답변

두 가지 유형의 프로세스가 있습니다. 일반 프로세스 와 실시간 일반 프로세스 (및 해당 프로세스에 대해서만)에는 nice가 다음과 같이 적용됩니다.

좋은

"niceness"스케일은 -20에서 19로, 반면 -20은 가장 높은 우선 순위이고 19는 가장 낮은 우선 순위입니다. 우선 순위 수준은 다음과 같이 계산됩니다.

PR = 20 + NI

NI는 좋은 수준이고 PR은 우선 순위입니다. 보시다시피, -20은 실제로 0에, 19는 39에 매핑됩니다.

기본적으로 프로그램 nice 값은 0 비트이며 루트 사용자는 다음 명령을 사용하여 지정된 nice 값으로 프로그램을 점심 식사 할 수 있습니다.

nice -n <nice_value> ./myProgram 

실시간

우리는 더 나아갈 수있었습니다. 좋은 우선 순위는 실제로 사용자 프로그램에 사용됩니다. UNIX / LINUX 전체 우선 순위의 범위는 140 개의 값이지만 nice 값을 사용하면 프로세스가 범위의 마지막 부분 (100-139)에 맵핑 될 수 있습니다. 이 방정식은 0에서 99까지의 값을 도달 할 수없는 상태로두고 음의 PR 수준 (-100에서 -1)에 해당합니다. 해당 값에 액세스하려면 프로세스를 "실시간"으로 지정해야합니다.

LINUX 환경에는 다음 명령으로 표시 할 수있는 5 개의 스케줄링 정책이 있습니다.

chrt -m 

다음 목록이 표시됩니다.

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

스케줄링 프로세스는 2 개의 그룹, 정상 스케줄링 정책 (1 내지 3) 및 실시간 스케줄링 정책 (4 및 5)으로 나 could 수있다. 실시간 프로세스는 항상 일반 프로세스보다 우선합니다. 다음 명령을 사용하여 실시간 프로세스를 호출 할 수 있습니다 (예 : SCHED_RR 정책을 선언하는 방법).

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

실시간 프로세스에 대한 PR 값을 얻으려면 다음 방정식이 적용됩니다.

PR = -1-rt_prior

여기서 rt_prior는 1과 99 사이의 우선 순위에 해당합니다. 따라서 다른 프로세스보다 우선 순위가 높은 프로세스는 숫자 99로 호출 된 프로세스입니다.

실시간 프로세스의 경우 좋은 가치가 사용되지 않습니다.

프로세스의 현재 "niceness"및 PR 값을 보려면 다음 명령을 실행할 수 있습니다.

top

예를 들어 PR 값이 -51 인 프로세스는 실시간 값에 해당합니다. PR 값이 "rt"로 표시된 일부 프로세스도 있습니다. 이 값은 실제로 -100의 PR 값에 해당합니다.

(PS : 나는 최고의 결과를 보여주는 그림을 올렸지 만 그렇게 할 평판은 없다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.