Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

34111
637
415410


[리눅스커널] 스케줄링: 프로세스를 깨울 때 호출하는 함수 - wake_up_process 10. 프로세스 스케줄링

프로세스를 깨울 때 커널에서 지원하는 어떤 함수를 호출해야 할까요? 이번 시간에 프로세스를 깨울 때 호출하는 대표적인 함수를 소개합니다.  
wake_up_process()
default_wake_function()
wake_up_state()
 
이어서 위에서 소개한 각 함수 코드를 보겠습니다.
1 int wake_up_process(struct task_struct *p)
2 {
3 return try_to_wake_up(p, TASK_NORMAL, 0);
4 }
5
6 int default_wake_function(wait_queue_entry_t *curr, unsigned mode, int wake_flags,
7   void *key)
8 {
9 return try_to_wake_up(curr->private, mode, wake_flags);
10 }
11
12 int wake_up_state(struct task_struct *p, unsigned int state)
13 {
14 return try_to_wake_up(p, state, 0);
15 }

3 개 함수 코드를 보면 다 같이 특별한 동작을 수행하진 않습니다. try_to_wake_up() 함수를 호출하면서 자신에게 전달된인자를 그대로 전달할 뿐입니다.

이번에 위 함수들에서 공통으로 호출하는 try_to_wake_up() 함수 인자를 알아볼까요? 
[https://elixir.bootlin.com/linux/v4.19.30/source/kernel/sched/core.c]
1 static int
2 try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)

위 함수에 전달되는 각 인자의 의미는 다음과 같습니다.
struct task_struct *p: 실행 요청할(깨울) 프로세스의 태스크 디스크립터
unsigned int state: 바꿀 프로세스 상태
int wake_flags: 설정할 플래그

try_to_wake_up() 함수에서 예외 처리 루틴을 제외한 주요 코드를 보겠습니다. 
[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/kernel/sched/core.c]
1 static int
2 try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
3 {
4 unsigned long flags;
..
5 ttwu_queue(p, cpu, wake_flags);
6 stat:
7 ttwu_stat(p, cpu, wake_flags);
8 out:
9 raw_spin_unlock_irqrestore(&p->pi_lock, flags);
10
11 return success;
12 }

특별한 동작을 수행하지는 않습니다. 단지 5 번째 줄 코드와 같이 ttwu_queue() 함수를 호출합니다.

이어서 분석한 코드는 ttwu_queue() 함수입니다.
[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/kernel/sched/core.c]
1 static void ttwu_queue(struct task_struct *p, int cpu, int wake_flags)
2 {
3 struct rq *rq = cpu_rq(cpu);
...
4 rq_lock(rq, &rf);
5 update_rq_clock(rq);
6 ttwu_do_activate(rq, p, wake_flags, &rf);
7 rq_unlock(rq, &rf);
8 }

6 번째 줄 코드와 같이 ttwu_do_activate() 함수를 호출합니다.

다음 소절에서 프로세스를 깨우는 핵심 동작인 ttwu_do_activate() 함수를 분석하겠습니다.


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

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

Reference(프로세스 스케줄링)

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


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

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

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







핑백

덧글

댓글 입력 영역