Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

97258
1323
114599


[리눅스커널] 스케줄링: 런큐에 접근하는 함수 - cpu_rq/this_rq 10. Process Scheduling

커널에서는 런큐에 접근할 수 있는 인터페이스 함수를 제공합니다.
cpu_rq()
this_rq() 

cpu_rq() 함수 분석하기

cpu_rq() 함수 코드부터 분석하겠습니다.
[https://elixir.bootlin.com/linux/v4.19.30/source/kernel/sched/sched.h]
1 #define cpu_rq(cpu)  (&per_cpu(runqueues, (cpu)))

cpu_rq() 함수 구현부를 보면 per-cpu 타입 runqueues 변수에서 CPU 오프셋을 적용한 주소에 접근하는 코드를 볼 수 있습니다.

커널 스케줄러 common 코드를 보면 cpu_rq() 함수를 써서 런큐 주소를 얻어오는 패턴을 자주 볼 수 있습니다.
[https://elixir.bootlin.com/linux/v4.19.30/source/kernel/sched/fair.c]
1 static unsigned long scale_rt_capacity(int cpu)
2 {
3 struct rq *rq = cpu_rq(cpu);

위 코드에서 cpu 번호에 해당하는 런큐 주소를 rq 포인터 주소에 저장합니다.

this_rq() 함수 분석하기

이번엔 this_rq() 함수를 소개합니다.
[https://elixir.bootlin.com/linux/v4.19.30/source/kernel/sched/sched.h]
1 #define this_rq()  this_cpu_ptr(&runqueues)

코드 구현부와 같이 per-cpu 타입 runqueues 런큐 변수를 cpu 오프셋을 적용해서 주소를 얻어옵니다. this_rq() 함수는 cpu 번호를 지정 안해도 현재 실행 중인 CPU 번호의 런큐 주소를 반환합니다.

다음은 this_rq() 함수를 쓰는 예제 코드를 소개합니다.
[https://elixir.bootlin.com/linux/v4.19.30/source/kernel/sched/core.c]
1 static int migration_cpu_stop(void *data)
2 {
3 struct migration_arg *arg = data;
4 struct task_struct *p = arg->task;
5 struct rq *rq = this_rq();

5 번째 줄 코드와 같이 this_rq() 함수를 써서 런큐 주소를 읽어서 rq이란 포인터에 저장합니다.


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

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

Reference(프로세스 스케줄링)

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



핑백

덧글

댓글 입력 영역