- 커널의 CPU 스케줄러는 시스템 처리량과 응답 시간 간의 절충을 구현하는 여러 선점 모드를 제공함.
- 2023년 9월, 스케줄링에 대한 논의에서 "게으른 선점(lazy preemption)"이라는 개념이 제안되었으며, 이는 커널의 스케줄링을 단순화하면서 더 나은 결과를 제공할 수 있음.
- 이 개념은 한동안 조용했지만, Peter Zijlstra의 패치 시리즈로 다시 등장함.
현재 커널의 선점 모드
-
PREEMPT_NONE: 실행 중인 작업이 시간 슬라이스를 소진했을 때만 선점이 허용됨.
-
PREEMPT_VOLUNTARY: 필요할 경우 커널 내에서 선점이 가능한 많은 지점을 추가함.
-
PREEMPT_FULL: 스핀락이 걸린 경우를 제외하고 거의 모든 지점에서 선점이 가능함.
-
PREEMPT_RT: 대부분의 다른 것보다 선점을 우선시하며, 대부분의 스핀락 코드도 선점 가능하게 만듦.
게으른 선점의 도입
- 게으른 선점 패치는 새로운 플래그 TIF_NEED_RESCHED_LAZY를 추가하여 즉시가 아닌 어느 시점에 리스케줄링이 필요함을 나타냄.
- 게으른 선점 모드(PREEMPT_LAZY)에서는 대부분의 이벤트가 이 새로운 플래그를 설정하며, 커널에서 사용자 공간으로 돌아갈 때 두 플래그 중 하나가 설정되면 스케줄러 호출이 이루어짐.
- 이 변경의 결과로, 게으른 선점 모드에서는 커널의 대부분의 이벤트가 현재 작업을 선점하지 않게 됨.
cond_resched() 제거
- 이 작업의 최종 목표는 PREEMPT_LAZY와 PREEMPT_FULL 두 가지 비실시간 모드만 남기는 것임.
- 게으른 모드는 PREEMPT_NONE과 PREEMPT_VOLUNTARY 사이의 위치를 차지하며, 이 두 모드를 대체함.
- 현재는 cond_resched() 호출이 남아 있으며, PREEMPT_NONE 및 PREEMPT_VOLUNTARY 모드가 존재하는 한 필요함.
GN⁺의 정리
- 게으른 선점은 커널의 스케줄링을 단순화하고 예측 가능한 지연 시간을 제공하는 데 기여할 수 있음.
- 이 작업은 커널의 크기를 줄이고 코드를 간소화하는 데 도움이 될 수 있음.
- 게으른 선점은 PREEMPT_VOLUNTARY와 유사한 처리량을 제공하지만, 더 많은 테스트와 최적화가 필요함.
- 유사한 기능을 가진 다른 프로젝트로는 FreeBSD의 ULE 스케줄러가 있음.