Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

80258
1323
114582


[라즈베리파이] 스케줄링: 선점(Preemptive)과 비선점(Non-preemptive) 스케줄링 10. Process Scheduling

커널에서 지원하는 스케줄링 방식은 크게 선점 스케줄링 방식과 비선점 스케줄링 방식으로 나눌 수 있습니다.
 

대부분 스케줄링하면 선점 스케줄링 방식으로 이해하는 경우가 많습니다.
히지만 커널은 프로세스 상태에 따라 유연하게 두 가지 방식을 같이 적용합니다.

먼저 선점 스케줄링 동작에 대해서 살펴보겠습니다.
선점이란 단어는 보통 영어로 Preemptive라고 쓰는 경우가 많습니다. 실제 개발자들은 선점이란 용어보다 Preemptive 를 더 자주 쓰기는 합니다. Preemptive 란 단어는 뭔가 점유하고 있는 것을 뺃어 버린다는 뜻이 있습니다.

조금 더 구체적으로 어떤 프로세스가 CPU를 점유하면서 실행 중인데 스케줄러가 강제로 프로세스를 CPU에서 빼내는 동작입니다. 여기서 스케줄러가 어떤 방식으로 실행 대기 상태인 프로세스를 선택해서 어떻게 CPU에서 실행 중인 프로세스를 비우느냐가 중요할 것입니다.

선점 스케줄링은 다음 2가지 시점에서 실행하게 됩니다.
+  인터럽트 핸들링 후
+  시스템 콜 핸들링 후

만약 "A란 프로세스가 선점 혹은 Preemption됐다"란 의미는 스케줄러가 CPU에서 실행 중인 A란 프로세스의 의사와 관계없이 강제로 중지한 다음 새로운 프로세스를 CPU에 실행 시킨다는 뜻입니다. 이후 새로운 프로세스가 CPU를 차지하게 됩니다.

선점 스케줄링 방식을 적용하면 어떤 이점을 얻을 수 있을까요?

어떤 프로세스가 CPU를 점유하면서 실행하건 강제로 실행 흐름을 중지시킬 수 있기 때문에 
실행 대기 상태로 기다리고 있는 프로세스들이 CPU에서 실행할 수 있는 기회를 더 자주 얻을 수 있습니다. 커널에서는 선점 방식을 적용해서 프로세스는 빠른 응답과 실행을 할 수 있도록 지원하는 것입니다.

어떤 프로세스가 자신이 CPU를 쓰고 싶을 만큼 충분히 점유하게 되면 실행 대기로 기다리는 프로세스들이 CPU를 차지하면서 실행할 수 있는 기회가 줄어들 수 밖에 없습니다.

만약 휴대폰에서 어떤 어플리케이션을 터치해서 실행을 시켰을 때 해당 어플리케이션을 구동하는 프로세스가 더 빨리 실행할 수 있게 됩니다.

선점 스케줄링 실행 시 주의해야 할 점이 있습니다.
컨택스트 스위칭이 빈번하게 발생하면 프로세스가 순수하게 실행할 수 있는 시간 이외에도 컨택스트 스위칭을 위한 커널 코드를 추가로 실행해야 합니다. 컨택스트 스위칭이 빈번하게 발생하면 프로세스 입장에서는 오버해드이고 결과 시스템 응답 속도가 느려지는 효과를 초래합니다.

프로세스 입장에서 중요한 동작을 수행 중이다가 선점될 수도 있습니다.
예를 들어 수학적 알고리즘을 실행 중이거나 디바이스에 정확한 타이밍으로 어떤 값을 써주는 동작일 수도 있는 것입니다.

이런 중요한 코드 구간을 preempt_disable()과 preempt_enable() 함수를 페어로 호출해서 선점 스케줄링을 지연시켜야 합니다.

이번에는 비선점 스케줄링을 소개합니다. 비선점 스케줄링이란 자발적인 스케줄링이라고도 이야기합니다. 프로세스가 입출력이 시작하면 프로세스가 스스로 CPU를 비우고 스케줄링을 수행할 수 있습니다.
입출력이 끝나면 다시 깨어나 실행 대기 상태로 변경해서 다시 실행을 시작하는 것입니다.

프로세스가 파일 I/O를 시작할 때 파일 입출력을 기다려야 하므로 CPU를 사용할 필요가 없습니다. 이 때 프로세스가 자발적으로 스케줄링 요청을 하는데 이를 비선점 스케줄링 방식이라고 말합니다.


"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)

Reference(프로세스 스케줄링)

스케줄링 소개
프로세스 상태 관리
   어떤 함수가 프로세스 상태를 바꿀까?
스케줄러 클래스
런큐
CFS 스케줄러
   CFS 관련 세부 함수 분석  
선점 스케줄링(Preemptive Scheduling)   
프로세스는 어떻게 깨울까?
스케줄링 핵심 schedule() 함수 분석
컨택스트 스위칭
스케줄링 디버깅
   스케줄링 프로파일링
     CPU에 부하를 주는 테스트   
     CPU에 부하를 주지 않는 테스트 

핑백

덧글

댓글 입력 영역