Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

32111
637
415408


[리눅스커널] 스케줄링: TASK_RUNNING(CPU 실행)로 바뀔 때 호출되는 함수 10. 프로세스 스케줄링

TASK_RUNNING(CPU실행)로 바뀔 때 호출하는 함수 분석
프로세스 상태를 CPU실행(TASK_RUNNING)으로 변경하는 함수는 1개 밖에 없습니다. __schedule() 함수를 실행할 때 프로세스는 CPU를 점유하면서 실행하는 상태로 바뀝니다.

__schedule() 함수 코드를 살펴봅시다.
[https://elixir.bootlin.com/linux/v4.19.30/source/kernel/sched/core.c]
1 static void __sched notrace __schedule(bool preempt)
2 {
3 struct rq *rq;
4 int cpu;
5
6 cpu = smp_processor_id();
7 rq = cpu_rq(cpu);
...
8 if (likely(prev != next)) {
9 rq->nr_switches++;
10 rq->curr = next;
...
11 /* Also unlocks the rq: */
12 rq = context_switch(rq, prev, next, &rf);
13 } else {
...

먼저 6~7 번째 줄 코드를 보겠습니다.
6 cpu = smp_processor_id();
7 rq = cpu_rq(cpu);

6 번째 줄은 현재 실행 중인 CPU 번호를 cpu 지역 변수에 저장합니다. 이어서 7 번째 줄은 현재 실행 중인 CPU 번호에 해당하는 런큐 구조를 rq 지역변수로 읽습니다.

컨텍스트 스위칭 동작 이전 코드인 8~10 번째 줄을 보겠습니다.
8 if (likely(prev != next)) {
9 rq->nr_switches++;
10 rq->curr = next;

스케줄러가 컨텍스트 스위칭으로 다음에 실행할 프로세스 태스크 디스크립터 주소는 next 지역 변수가 담고 있습니다. 10 번째 줄 코드를 보면 런큐 구조체 curr 필드에 next를 저장합니다.

런큐 구조체 curr 필드는 현재 CPU를 점유하면서 실행 중인 프로세스 태스크 디스크립터 주소를 저장합니다. 이 코드가 실행하면서 current 프로세스 혹은 TASK_RUNNING(CPU실행) 상태로 바꾸는 것입니다.

누군가 ’커널에서 CPU를 점유하면서 실행 중인 프로세스는 어디서 확인할까’라고 질문을 던진다면 어떻게 답할 수 있을까요? 다음과 같이 대답할 수 있습니다. 

    런큐 struct rq 구조체 curr 필드에서 확인할 수 있다.


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

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

Reference(프로세스 스케줄링)

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


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

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

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


 



핑백

덧글

댓글 입력 영역