스케줄링 - 어떤 실시간 우선 순위가 Linux에서 가장 높은 우선 순위인가?




sched_rr (4)

  1. 물론, 실시간 우선 순위는 FIFO 및 RR의 RT 정책 (0-99까지 다양 함)에 적용 할 수 있습니다.
  2. 우리는 BATCH에 대한 실시간 이외의 프로세스 우선 순위의 수를 40으로 지정하고, 기타 정책은 0-39가 아닌 100에서 139까지 다양합니다. 시스템에서 실시간이 아닌 프로세스를 관찰하여 관찰 할 수 있습니다 방법. 기본적으로 20의 홍보와 0의 NIceness를 부담 할 것입니다. 프로세스의 niceness를 줄이면 프로세스의 niceness를 줄이거 나 (일반적으로 niceness보다 적은 수의, nheeness보다 적은 수의 프로세스를 배제 함) 0에서 -1로 말하면, PRiority가 20에서 19로 떨어질 것이라는 것을 알 수 있습니다. 프로세스를 더 배고프게 만들거나 PID의 niceness 값을 줄임으로써 조금 더주의를 기울이기를 원한다면 우선 순위도 낮아질 것이므로 PRIORITY 번호를 우선 순위보다 낮 춥니 다.

    Example:
    
    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    2079 admin     10 -10  280m  31m 4032 S  9.6  0.0  21183:05 mgmtd
    [[email protected] ~]# renice -n -11 2079
    2079: old priority -10, new priority -11
    [[email protected] ~]# top -b | grep mgmtd
    2079 admin      9 -11  280m  31m 4032 S  0.0  0.0  21183:05 mgmtd
    ^C
    

희망이 실제적인 예제는 의심을 명확히하고 잘못된 소스에 단어를 수정하는 데 도움이되기를 바랍니다.

https://code.i-harness.com

Linux 실시간 프로세스 우선 순위 범위 인 1에서 99까지는 어느 것이 가장 우선 순위가 높은지 1 또는 99인지는 분명하지 않습니다.

"Linux 커널 이해하기"(O'Reilly)의 섹션 7.2.2는 1이 가장 높은 우선 순위이며 정상적인 프로세스는 100에서 139 사이의 정적 우선 순위를 가지며 100을 최우선 순위로 생각합니다.

"모든 실시간 프로세스는 실시간 우선 순위와 관련이 있습니다. 실시간 우선 순위는 1 (최우선 순위)에서 99 (최하위 우선 순위)까지의 값입니다."

한편, sched_setscheduler man 페이지 (RHEL 6.1)는 99가 가장 높다고 주장합니다.

"실시간 정책 (SCHED_FIFO, SCHED_RR) 중 하나에서 스케줄 된 프로세스의 sched_priority 값은 1 (낮음)에서 99 (높음) 사이입니다."

어느 것이 가장 높은 실시간 우선 순위입니까?


다음과 같이 실험을 해 보았습니다.

  • process1 : RT 우선 순위 = 40, CPU 선호도 = CPU 0.이 프로세스는 10 초 동안 "회전"하므로 낮은 우선 순위 프로세스가 CPU 0에서 실행되지 않습니다.

  • process2 : RT 우선 순위 = 39, CPU affinity = CPU 0.이 프로세스는 중간에 0.5 초마다 메시지를 표준 출력으로 인쇄합니다. 각 메시지와 함께 경과 시간을 인쇄합니다.

PREEMPT_RT 패치가있는 2.6.33 커널을 실행하고 있습니다.

실험을 실행하기 위해 한 창에서 process2를 (루트로) 실행 한 다음 다른 창에서 process1 (루트로)을 시작합니다. 결과적으로 process1은 process2를 선점 한 것으로 보이며 10 초 동안 실행되지 않습니다.

두 번째 실험에서 process2의 RT 우선 순위를 41로 변경합니다.이 경우 process2는 process1에 의해 선점 되지 않습니다 .

이 실험은 sched_setscheduler ()의 더 큰 RT 우선 순위 값이 우선 순위가 더 높음을 보여줍니다. 이것은 Michael Foukarakis가 sched.h에서 지적한 것과 모순 된 것처럼 보이지만 실제로는 그렇지 않습니다. 커널 소스의 sched.c 에는 다음과 같은 것들이 있습니다 :

static void
__setscheduler(struct rq *rq, struct task_struct *p, int policy, int prio)
{
        BUG_ON(p->se.on_rq);

        p->policy = policy;
        p->rt_priority = prio;
        p->normal_prio = normal_prio(p);
        /* we are holding p->pi_lock already */
        p->prio = rt_mutex_getprio(p);
        if (rt_prio(p->prio))
                p->sched_class = &rt_sched_class;
        else
                p->sched_class = &fair_sched_class;
        set_load_weight(p);
}

rt_mutex_getprio (p)는 다음을 수행합니다.

return task->normal_prio;

normal_prio ()는 다음과 같은 일을합니다.

prio = MAX_RT_PRIO-1 - p->rt_priority;  /* <===== notice! */
...
return prio;

즉, 우리는 (내 자신의 해석) :

p->prio = p->normal_prio = MAX_RT_PRIO - 1 - p->rt_priority

와우! 그것은 혼란 스럽다! 요약:

  • p-> prio의 값이 작 으면 더 큰 값을 선점합니다.

  • p-> rt_priority의 값이 클수록 작은 값보다 우선합니다. 이것은 sched_setscheduler ()를 사용하여 설정되는 실시간 우선 순위입니다.


프로그래밍 방식으로 설정할 수있는 가장 높은 실시간 우선 순위를 결정하려면 sched_get_priority_max 함수를 사용하십시오.

Linux 2.6.32에서 sched_get_priority_max (SCHED_FIFO)를 호출하면 99가 반환됩니다.

http://linux.die.net/man/2/sched_get_priority_max를 참조 하십시오.


sched.h 의이 주석은 매우 명확합니다.

/*
 * Priority of a process goes from 0..MAX_PRIO-1, valid RT
 * priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH
 * tasks are in the range MAX_RT_PRIO..MAX_PRIO-1. Priority
 * values are inverted: lower p->prio value means higher priority.
 *
 * The MAX_USER_RT_PRIO value allows the actual maximum
 * RT priority to be separate from the value exported to
 * user-space.  This allows kernel threads to set their
 * priority to a value higher than any user task. Note:
 * MAX_RT_PRIO must not be smaller than MAX_USER_RT_PRIO.
 */

이 부분에 유의하십시오.

우선 순위 값이 반전됩니다 : 낮은 p->prio 값은 높은 우선 순위를 의미 합니다.





real-time