Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

34111
637
415410


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

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

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

먼저 선점 스케줄링 동작에 대해서 살펴보겠습니다.
선점이란 단어는 보통 영어로 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에 부하를 주지 않는 테스트 


# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2


 


핑백

덧글

  • 최재국 2020/08/10 17:01 # 삭제 답글

    프로세스가 입출력이 시작하면 프로세스가 스스로 CPU를 비우고 스케줄링을 수행할 수 있습니다.
    입출력이 끝나면 다시 깨어나 실행 대기 상태로 변경해서 다시 실행을 시작하는 것입니다.
    이라고 하셧는데

    근데 프로세스는 자신을 깨울수 없기 때문에 다른 프로세스가 깨워줘야하는것으로 알고 있습니다.
    그럼 입출력을 처리하는 프로세스를 만들고 입출력 완료 후 이 프로세스가 기존 프로세스를 깨우는 형식을 동작하는것인가요??
  • AustinKim 2020/08/10 17:21 #

    이해하신 내용이 맞습니다. 프로세스는 스스로 깨어날 수 없습니다.
    다음과 같이 수정될 예정입니다.

    입출력이 끝나면 (스케줄러에 의해) 다시 깨어나 실행 대기 상태로 변경해서 다시 실행을 시작하는 것입니다.
    감사합니다.
  • 2020/08/10 17:21 # 답글 비공개

    비공개 덧글입니다.
  • 김태형 2022/04/13 21:46 # 삭제 답글

    안녕하세요. 질문이 하나 있습니다.
    비선점 스케줄링에서는 프로세스가 자발적 양보 혹은 I/O 시작을 할 때 다른 프로세스에게 기회를 주는 것으로 이해를 했습니다.
    그러면 양보를 한 프로세스를 A라고 하면 A는 다시 run queue 뒤로 들어가서 누군가 양보를 할때까지 기다리는 것인가요?
    만일 I/O 시작을 한 경우면, I/O 완료에 의한 인터럽트에 의해 높은 우선순위를 가지고서 다시 CPU를 차지하는 것인가요?
댓글 입력 영역