최상위 출력에서 ​​좋은 값과 우선순위의 차이

최상위 출력에서 ​​좋은 값과 우선순위의 차이

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

우선 사항:

   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.

나는 이해좋은 가치커널의 CPU 스케줄러 큐와 관련되어 있습니다. 그렇다면 무엇을 하는가우선 사항나타내다? 아마도 I/O에 관한 것일까요?

답변1

좋은 값은 "전역" 메커니즘인 반면 우선 순위는 작업 전환기와 관련이 있습니다.지금 바로.

답변2

차이점은홍보커널 내부에서 현재 프로세스의 실제 우선 순위는NI프로세스의 우선순위가 무엇인지 커널에 대한 힌트일 뿐입니다.

대부분의 경우에홍보값은 다음 공식으로 계산할 수 있습니다.PR = 20 + NI. 따라서 niceness 3인 프로세스의 우선순위는 23(20 + 3)이고 niceness -7인 프로세스의 우선순위는 13(20 - 7)입니다. command 를 실행하여 첫 번째를 확인할 수 있습니다 nice -n 3 top. 그것은 보여줄 것입니다맨 위프로세스가NI 3그리고홍보 23. 그러나 nice -n -7 top대부분의 Linux 시스템에서 실행하려면 실제로 루트 권한이 낮기 때문에 루트 권한이 필요합니다.홍보값은 실제 우선순위가 더 높습니다. 따라서 프로세스는홍보 13표준 우선순위를 가진 프로세스보다 우선순위가 높습니다.홍보 20. 그렇기 때문에 루트가 되어야 합니다. 그러나 루트가 아닌 프로세스에 허용되는 최소 niceness 값은 다음에서 구성할 수 있습니다./etc/security/limits.conf.

이론적으로 커널은 변경될 수 있습니다.홍보가치 (하지만NI) 그 자체로. 예를 들어, CPU를 너무 많이 소비하는 경우 프로세스의 우선 순위를 낮추거나 우선 순위가 더 높은 다른 프로세스로 인해 해당 프로세스가 오랫동안 실행될 기회가 없는 경우 프로세스의 우선 순위를 높일 수 있습니다. 이러한 경우에는홍보값은 커널에 의해 변경되며NI동일하게 유지되므로 공식은"PR = 20 + NI"정확하지 않을 것입니다. 그래서NI값은 프로세스의 우선순위가 무엇인지 커널에 대한 힌트로 해석될 수 있지만 커널은 실제 우선순위를 선택할 수 있습니다(홍보value) 상황에 따라 다릅니다. 하지만 일반적으로 공식은"PR = 20 + NI"맞다.

커널이 우선순위를 어떻게 변경하는지 정확한 규칙은 명확하지 않습니다.우선순위 설정(좋은 값을 변경하는 기능) 매뉴얼은 다음과 같이 말합니다.

nice 값을 변경하는 효과는 적용되는 프로세스 스케줄링 알고리즘에 따라 달라질 수 있습니다.

Pthread 매뉴얼다음과 같이 말합니다:

동적 우선순위는 nice 값(nice(2), setpriority(2) 또는 sched_setattr(2)에 의해 설정됨)을 기반으로 하며 스레드가 실행할 준비가 되었지만 스케줄러에 의해 실행이 거부될 때마다 퀀텀당 증가합니다.

것 같다홍보값은 동적 우선순위에 해당합니다.

범위는NI가치는-20..19. 그래서홍보값은 다음의 값을 가질 수 있습니다.0(20 - 20) ~39(20 + 19). 그러나 이는 기본 스케줄링 정책(SHED_OTHER). 소위 말하는 프로세스도 있을 수 있습니다."실시간"일정 정책. 이러한 정책은SCHED_RR그리고SCHED_FIFO. 이러한 프로세스에는홍보값이 0보다 작습니다. 명령을 실행하여 이를 확인할 수 있습니다 chrt -r 1 top(루트 사용자여야 함). 그만큼맨 위프로세스는PR -2. chrt -r 90 top어떤 경우에는 실행할 수도 있습니다 .맨 위프로세스는홍보 -91.

그것은 것 같다SCHED_RR처리홍보값은 다음 공식으로 계산할 수 있습니다.

PR = - 1 - sched_rr_priority.

따라서SCHED_RR프로세스는 적어도홍보 -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에도 적용됩니다.

실시간 프로세스의 우선순위는 커널이 변경할 수 없는 정적 우선순위라고 합니다. 너무 긍정적이야홍보값은 실시간이 아닌 경우 동적 우선순위로 처리될 수 있습니다(SCHED_OTHER,SCHED_BATCH) 프로세스 및 네거티브홍보실시간 프로세스에 대한 정적 우선순위 값(SCHED_RR,SCHED_FIFO).

나는 또한 달리기를 시도 nice -n 10 chrt -r 50 top했다 chrt -r 50 nice -n 10 top. 그만큼NI값은 10이었지만홍보아직도 그랬어-51. 그래서 그런 것 같아요NI값은 우선순위에 영향을 주지 않습니다.SCHED_RR프로세스. 이는 다음에 해당합니다.우선순위 설정수동:

SCHED_FIFO 또는 SCHED_RR을 사용하는 모든 프로세스나 스레드는 setpriority() 호출의 영향을 받지 않습니다. 이는 오류로 간주되지 않습니다. 이후에 SCHED_OTHER로 되돌아가는 프로세스는 그러한 setpriority() 호출에 의해 우선순위가 영향을 받을 필요가 없습니다.

재미있는 메모 하나. 실행하면 chrt -r 99 top보입니다.RT숫자 대신 값홍보열.

  PID 사용자 PR NI VIRT RES SHR S %CPU %MEM TIME+ 명령
28489 루트 RT 0 2852 1200 896 R 0 0.1 0:00.01 상단

나는 이것이 그 과정이 이제 특별하다는 것을 의미한다고 생각하지 않습니다. 내 생각엔 이런 뜻인 것 같아맨 위그냥 인쇄하지 마세요-100인쇄하려면 4자가 필요하기 때문입니다.

당신은 또한 사용할 수 있습니다htop대신에맨 위모든 예에서 더 편리할 수 있습니다. ps -l도 사용할 수 있지만 실시간 우선순위와 비실시간 우선순위를 구분하는 기준점은 0이 아니라 60이므로 nice -n -20 ps -l인쇄됩니다 .

FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY 시간 CMD
4 R 0 28983 28804 0 60 -20 - 1176 - pts/6 00:00:00 ps

답변3

짧은 답변

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

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

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

긴 답변

프로세스에는 2가지 유형이 있습니다.정상그들과실시간 일반적인 것의 경우(그리고 그러한 경우에만) nice는 다음과 같이 적용됩니다.

멋진

"좋음" 척도는 -20에서 19까지이며, -20이 가장 높은 우선순위이고 19가 가장 낮은 우선순위입니다. 우선순위 수준은 다음과 같이 계산됩니다.

PR = 20 + NI

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

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

nice -n <nice_value> ./myProgram 

실시간

우리는 더 멀리 갈 수 있습니다. nice 우선순위는 실제로 사용자 프로그램에 사용됩니다. UNIX/LINUX 전체 우선순위의 값 범위는 140인 반면, nice 값을 사용하면 프로세스가 범위의 마지막 부분(100~139)에 매핑할 수 있습니다. 이 방정식은 음의 PR 수준(-100에서 -1까지)에 해당하는 0에서 99까지의 값에 도달할 수 없게 합니다. 이러한 값에 액세스할 수 있으려면 프로세스가 "실시간"으로 명시되어야 합니다.

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

스케줄링 프로세스는 일반 스케줄링 정책(1~3)과 실시간 스케줄링 정책(4~5)의 두 그룹으로 나눌 수 있습니다. 실시간 프로세스는 항상 일반 프로세스보다 우선합니다. 다음 명령을 사용하여 실시간 프로세스를 호출할 수 있습니다(예제는 SCHED_RR 정책을 선언하는 방법입니다).

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

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

PR = -1 - rt_prior

여기서 rt_prior는 1에서 99 사이의 우선순위에 해당합니다. 이러한 이유로 다른 프로세스보다 높은 우선순위를 갖는 프로세스는 번호 99로 호출됩니다.

실시간 프로세스의 경우 nice 값이 사용되지 않는다는 점에 유의하는 것이 중요합니다.

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

top

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

(PS: 최고의 결과를 보여주는 사진을 게시하고 싶었지만 그렇게 할 만한 평판이 없습니다.)

관련 정보