유휴 작업의 우선순위는 무엇입니까?

유휴 작업의 우선순위는 무엇입니까?

설명대로일부(조금 늙었음)기사,리눅스유휴 작업(PID=0, CPU당 하나) 실행할 다른 작업이 없을 때 실행됩니다. 스케줄러가 이 작업을 수행하려면 유휴 작업의 우선 순위가 가장 낮아야 합니다. 링크된 LWN 기사의 이전 기사에는 다음 Documentation/ftrace.txt과 같이 명확하게 나와 있습니다.

prio "140"은 우선순위가 가장 낮은 스레드(pid 0)인 유휴 작업용으로 예약되어 있습니다.

이는 의미가 있지만 Linux 4.9에서는

# perf record -e sched:sched_switch sleep 1
# perf script
   sleep  6526 [000] 362661.310842: sched:sched_switch: sleep:6526 [120] S ==> swapper/0:0 [120]

보고 우선순위는 120 swapper/0(오른쪽 괄호 안)으로 위와 모순됩니다.

이제 Linux 스케줄러는 유휴 작업을 어떻게 처리합니까? 커밋 변경 사항 ftrace.txt(87d80de28, 294ae4011)이 도움이 되지 않았습니다.

답변1

나한테 좋은 게 있어답변Linux 커널 메일링 리스트의 Till Smejkal에서:

유휴 작업에는 CPU 코어당 유휴 스레드만 처리하는 자체 예약 클래스가 있습니다. 이 스케줄링 클래스는 커널에서 사용 가능한 스케줄링 클래스 중에서 우선순위가 가장 낮습니다. 이는 CPU에서 예약할 작업이 있는지 작업 전환 시 요청되는 예약 클래스 목록의 마지막 클래스임을 의미합니다. 따라서 유휴 작업은 CFS에서 관리되지 않으므로 적절한 가치나 우선 순위가 없습니다(또는 적어도 지금은 중요하지 않습니다). 더 많은 정보를 포함할 수 있는 커널 소스 코드의 흥미로운 파일은 kernel/sched/idle_task.c, kernel/sched/sched.h및 입니다 kernel/sched/core.c.

그러나 내 이해에 따르면 작업은 CFS에서 관리되지 않음에도 불구하고 우선 순위를 가질 수 있습니다. 실시간 작업( SCHED_FIFO및 )은 POSIX에서 요구하는 대로 의미 있는 우선 순위 SCHED_RR에 속하며 확실히 의미 있는 우선 순위를 갖습니다.rt_sched_class

static inline int rt_policy(int policy)
{
    return policy == SCHED_FIFO || policy == SCHED_RR;
}

하지만 지금은 준비에 초점이 맞춰져 있어요수업다음 구조로 구현되는 우선순위는 포인터를 통해 다음 순서로 연결됩니다 const struct sched_class..next

stop_sched_class
dl_sched_class
rt_sched_class
fair_sched_class
idle_sched_class

연결리스트는 kernel/sched/sched.h( )에 의해 순회된다.

#ifdef CONFIG_SMP
#define sched_class_highest (&stop_sched_class)
#else
#define sched_class_highest (&dl_sched_class)
#endif
#define for_each_class(class) \
   for (class = sched_class_highest; class; class = class->next)

위의 인용문에서 언급했듯이 각 클래스는 다음과 같이 실행 가능한 작업을 제공 pick_next_task()해야 합니다 .kernel/sched/core.c

again:
    for_each_class(class) {
            p = class->pick_next_task(rq, prev, rf);
            if (p) {
                    if (unlikely(p == RETRY_TASK))
                            goto again;
                    return p;
            }
    }

이는 유휴 작업이 우선 순위 값(일부 기본값)을 갖지만 예약 결정 중에 이를 참조하지 않는다는 것을 의미합니다 idle_sched_class.

위의 내용은 우선순위 값을 변경하는 문제를 열어두었지만 이는 현재 대부분 역사적 관심 사항입니다(위의 코드 인용문은 Linux 4.16에서 가져온 것입니다).

관련 정보