프로세스 우선순위는 어떻게 계산되나요?

프로세스 우선순위는 어떻게 계산되나요?

"실제" 프로세스 우선순위(예: pri_baz?ps

내 추측은 다음과 같습니다

pri_baz = 99 - static_priority  # if static_priority > 0 (real-time process)
pri_baz = 100 + min(20 + nice + dynamic_adjustment, 39)  # if static_priority = 0 (time-shared process)

다음 테스트가 이를 지원합니다.

# chrt -r 1 sleep 1 \
> & chrt -r 99 sleep 1 \
> & nice --20 sleep 1 \
> & nice -19 sleep 1 \
> & ps -C sleep -O pri_baz
[1] 25408
[2] 25409
[3] 25410
[4] 25411
   PID BAZ S TTY          TIME COMMAND
 25408  98 S pts/3    00:00:00 sleep 1
 25409   0 S pts/3    00:00:00 sleep 1
 25410 100 S pts/3    00:00:00 sleep 1
 25411 139 S pts/3    00:00:00 sleep 1

그러나 나는 다음과 같은 이유로 혼란스러워합니다.

  1. pri_baz= 99는 사용되지 않은 것으로 보입니다.

  2. Linux(기본적으로)는 140개의 우선순위 대기열을 처리하는 반면 이 구성표는 139개의 우선순위 값만 제공한다는 것을 알고 있습니다.

답변1

ps의 출력 에서pri_baz다음과 같이 계산됨 pp->priority + 100는 커널의 값 pp->priority입니다 . prio이것은~로 서술 된

프로세스 우선순위는 MAX_PRIO0..-1에서 시작하고, 유효 RT 우선순위는 0..- MAX_RT_PRIO1이며 SCHED_NORMAL/ SCHED_BATCH 작업 범위는 MAX_RT_PRIO..- MAX_PRIO1입니다. 우선순위 값은 반대입니다. p->prio값이 낮을수록 우선순위가 높습니다.

MAX_USER_RT_PRIO값을 사용하면 실제 최대 RT 우선순위를 사용자 공간으로 내보낸 값과 분리할 수 있습니다. 이를 통해 커널 스레드는 자신의 우선순위를 사용자 작업보다 높은 값으로 설정할 수 있습니다. MAX_RT_PRIO참고 : MAX_USER_RT_PRIO.

따라서 커널의 범위는 0에서 MAX_PRIO–1(139)까지 140개의 값을 포함합니다.

하지만,최소 FIFO 및 RT 우선순위는 1입니다., 누락된 값을 설명합니다. 입력 값(적어도 다음을 사용하여 사용자 공간에서 설정할 수 있음)sched_setscheduler) 1부터 99까지, 커널prio수식을 사용하여 값으로 변환 MAX_RT_PRIO- 1 -우선순위, 0에서 98 사이의 값을 제공합니다.

답변2

나는 이것에 대해 매우 새로운 것입니다 (전문가는 아닙니다). 0과 139가 보이는데, 이는 범위가 최소 140임을 의미합니다. 실시간 우선순위를 1과 99로 설정하셨는데 0과 98로 보고된 것을 확인하실 수 있습니다. 귀하의 요구 사항과 보고되는 내용 모두에 맞게 범위 40의 이점을 확인했습니다. 따라서 -1이 포함될 수 있습니다. 하지만 99는 특별하지 않다고 생각해요.

설정할 수 있는 가장 높은 값은 chrt -r99입니다. 이 보고서는 98입니다.

누군가 어딘가에서 구현에 심각한 실수를 한 것 같습니다.

관련 정보