Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

99258
1323
114601


[리눅스커널] 스케줄링: 프로세스를 깨운다는 것은 무엇을 의미할까? 10. Process Scheduling

여러분은 운영체제나 커널에서 다음과 같은 문장을 많이 읽어 봤을 것입니다. 

    프로세스 A를 깨우는 동작이다.

여기서 '프로세스를 깨운다.'란 문장의 의미는 무엇일까요? 이 내용을 이번 절에서 다루고자 합니다.

만약 누군가 'A 프로세스를 깨운다.'라고 말한다면 커널 입장에서 다음과 같이 해석할 수 있습니다. 

    스케줄러에게 프로세스 실행 요청을 한다.

즉, A 프로세스를 깨운다라는 말은 A 프로세스 실행 요청을 한다는 뜻을 지닙니다. 

프로세스 실행 요청을 하고 나면 누가 실행시킬까요? 스케줄러가 다음에 어떤 프로세스를 실행할지 결정을 합니다.
 
정리하겠습니다. 누군가 'A 프로세스를 깨운다.' 라고 말하면 커널에서 다음과 같이 해석할 수 있습니다.
A 프로세스 실행 요청을 한다
스케줄러가 실행 요청을 한 A 프로세스를 실행 시킬 지 판단합니다.

이번 소절에서는 프로세스를 깨운다는 용어의 의미와 코드 분석으로 커널 세부 동작을 살펴보겠습니다.

프로세스를 깨운다는 것은 무엇을 의미할까?

프로세스를 깨우는 동작은 크게 2단계로 분류할 수 있습니다.

1 단계: 런큐에 깨울 프로세스를 Enqueue
런큐에 깨울 프로세스를 Enqueue하면 실행 대기 상태(TASK_RUNNING)가 됩니다. 스케줄러는 런큐에 실행 대기 상태로 기다리는 프로세스 중에 우선순위가 가장 높은 프로세스를 컨텍스트 스위칭 대상으로 선정합니다.


실행 대기 상태 프로세스들 중 가장 우선순위가 높은 프로세스는 vruntime 이 제일 적습니다. 런큐에서 관리하는 레드 블랙 트리 가장 왼쪽 노드에 있습니다.


2단계: current 프로세스 TIF_NEED_RESCHED
현재 CPU를 점유하면서 실행 중인 프로세스의 current_thread_info()->flag를 TIF_NEED_RESCHED 필드로 설정합니다. 이 후 인터럽트나 시스템 콜 핸들링을 마무리하는 시점에 current_thread_info()->flag가 TIF_NEED_RESCHED 필드이면 Preemption을 실행하게 됩니다.

여기서 한 가지 의문이 생깁니다. 프로세스는 누가 깨울까요? 프로세스를 깨우는 주인공은 자신이 아닙니다. 프로세스가 깨어나기 전에 대부분 프로세스는 휴면 상태에 있습니다. 따라서 다른 프로세스가 깨워줘야 합니다.


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

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

Reference(프로세스 스케줄링)

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




핑백

덧글

댓글 입력 영역