4.2. CPU 스케줄링
스케줄러는 시스템의 CPU를 지속적으로 가동시키는 역할을 합니다. Linux 스케줄러는 여러 스케줄링 정책을 구현하고 특정 CPU 코어에서 스레드를 언제 얼마나 오랫동안 실행할 지를 결정합니다.
스케줄링 정책은 다음과 같은 두 가지 주요 범주로 나눌 수 있습니다:
- 실시간 정책
- SCHED_FIFO
- SCHED_RR
- 일반 정책
- SCHED_OTHER
- SCHED_BATCH
- SCHED_IDLE
4.2.1. 실시간 스케줄링 정책
실시간 스레스가 먼저 스케줄되고 모든 실시간 스레드가 스케줄 된 후 일반 스레드가 스케줄됩니다.
실시간 정책은 인터럽트없이 완료해야 하는 시간이 중요한 작업에 사용됩니다.
SCHED_FIFO
- 이 정책은 정적 우선 순위 스케줄링이라고도 합니다. 이는 각 스레드의 고정 우선 순위 (1에서 99 사이)를 정의하기 때문입니다. 이 스케줄러는 SCHED_FIFO 스레드 목록을 우선 순위 순서로 스캔하여 실행할 준비가 된 가장 우선 순위가 높은 스레드를 스케줄합니다. 이 스레드는 차단, 종료 또는 실행할 준비가 된 보다 높은 우선 순위를 갖는 스레드로 대체될 때 까지 실행됩니다.우선 순위가 가장 낮은 실시간 스레드도 비 실시간 정책 스레드 보다 먼저 스케줄됩니다. 하나의 실시간 스레드만이 존재할 경우
SCHED_FIFO
우선 순위 값은 중요하지 않습니다. SCHED_RR
SCHED_FIFO
정책의 라운드 로빈 변형입니다.SCHED_RR
스레드에는 고정 우선 순위 (1에서 99 사이)가 주어집니다. 하지만 동일한 우선 순위를 갖는 스레드는 특정 양 또는 시간 범위 내에서 라운드 로빈 스타일이 스케줄됩니다.sched_rr_get_interval(2)
시스템 호출은 시간 범위 값을 반환하지만 시간 범위 길이를 사용자가 설정할 수 없습니다. 이 정책은 동일한 우선 순위로 여러 스레드를 실행해야 하는 경우 유용합니다.
실시간 스케줄링 정책의 정의된 의미에 대한 보다 자세한 내용은 시스템 인터페이스 — 실시간의 IEEE 1003.1 POSIX 표준에서 참조하십시오. 이는 http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08.html에서 확인할 수 있습니다.
스레드 우선 순위 점의에 있어서 모범 사례는 낮은 순위에서 시작하여 정당한 지연이 확인된 경우에만 우선 순위를 증가시키는 것입니다. 실시간 스레드는 일반 스레드 처럼 기간이 있지 않습니다.
SCHED_FIFO
스레드는 차단, 종료, 더 높은 우선 순위를 갖는 스레드로 대체될 때 까지 실행됩니다. 따라서 우선 순위를 99로 설정하는 것은 권장되지 않습니다. 이는 프로세스를 마이그레이션 및 워치독 스레드와 동일한 우선 순위 레벨로 배치하는 것이 됩니다. 이러한 스레드는 연산 루프에 들어갔기 때문에 이러한 스레드가 차단되면 실행 불가능하게 됩니다. 이러한 상황에서 단일 프로세서 시스템은 궁극적으로 잠금되어 버립니다.
Linux 커널에서
SCHED_FIFO
정책에는 대역폭 제한 메커니즘이 포함되어 있습니다. 이는 CPU를 독점할 수 있는 실시간 작업에서 실시간 애플리케이션 프로그래머를 보호합니다. 이러한 메커니즘은 다음의 /proc
파일 시스템 매개 변수를 통해 조정할 수 있습니다:
/proc/sys/kernel/sched_rt_period_us
- CPU 대역폭의 100% 가능한 시간을 마이크로초 단위로 정의합니다. ('us'는 일반 텍스트 'µs'에 가장 가까운 것에 해당됨) 기본값은 1000000µs 또는 1 초입니다.
/proc/sys/kernel/sched_rt_runtime_us
- 실시간 스레드 실행에 할당할 시간을 마이크로초 단위로 정의합니다 ('us'는 일반 텍스트 'µs'에 가장 가까운 것에 해당됨). 기본 값은 950000µs 또는 0.95 초입니다.