![유휴 작업의 우선순위는 무엇입니까?](https://linux55.com/image/130784/%EC%9C%A0%ED%9C%B4%20%EC%9E%91%EC%97%85%EC%9D%98%20%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
설명대로일부(조금 늙었음)기사,리눅스유휴 작업(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에서 가져온 것입니다).