ARM Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

192239
1625
172589


[리눅스커널] 프로세스: wake_up_new_task() 함수 분석 4. 프로세스(Process) 관리

프로세스 생성의 마지막 단계로 생성한 프로세스를 깨웁니다. 이 동작은 wake_up_new_task() 함수가 수행합니다. 

프로세스 상태를 TASK_RUNNING으로 변경
현재 실행 중인 CPU 번호를 thread_info 구조체의 cpu 필드에 저장
런큐에 프로세스를 큐잉

이번 절에서는 다음 wake_up_new_task() 함수를 분석하겠습니다. 

https://elixir.bootlin.com/linux/v4.19.30/source/kernel/sched/core.c
1 void wake_up_new_task(struct task_struct *p)
2 {
3 struct rq_flags rf;
4 struct rq *rq;
5
6 add_new_task_to_grp(p);
7 raw_spin_lock_irqsave(&p->pi_lock, rf.flags);
8
9 p->state = TASK_RUNNING;
10 #ifdef CONFIG_SMP
11 __set_task_cpu(p, select_task_rq(p, task_cpu(p), SD_BALANCE_FORK, 0, 1));
12 #endif
13 rq = __task_rq_lock(p, &rf);
14 update_rq_clock(rq);
15 post_init_entity_util_avg(&p->se);
16
17 mark_task_starting(p);
18 activate_task(rq, p, ENQUEUE_NOCLOCK);


wake_up_new_task() 함수의 인자인 task_struct *p는 새롭게 생성된 프로세스의 태스크 디스크립터입니다.


9 번째 줄을 보겠습니다.

9 p->state = TASK_RUNNING;

프로세스 상태를 TASK_RUNNING으로 바꿉니다.

다음으로 11 번째 줄을 봅시다.

11 __set_task_cpu(p, select_task_rq(p, task_cpu(p), SD_BALANCE_FORK, 0, 1));

__set_task_cpu() 함수를 호출해 프로세스의 thread_info 구조체의 cpu 필드에 현재 실행 중인 CPU 번호를 저장합니다.

마지막으로 13~17 번째 줄을 봅시다.

13 rq = __task_rq_lock(p, &rf);
14 update_rq_clock(rq);
15 post_init_entity_util_avg(&p->se);
16
17 mark_task_starting(p);
18 activate_task(rq, p, ENQUEUE_NOCLOCK);

13번째 줄에서 런큐 주소를 읽은 다음, 18번째 줄에서 activate_task() 함수를 호출해 런큐에 새롭게 생성한 프로세스를 큐잉합니다. 그런데 여기서 생성한 프로세스를 바로 실행할 수 있을까요?

프로세스 스케줄러는 런큐에 대기 중인 프로세스와 우선순위를 계산해 새로 생성된 프로세스를 실행할지 결정합니다. 만약 실행을 기다리는 프로세스가 많거나 우선순위가 높은 프로세스가 이미 실행 중이면 새롭게 생성된 프로세스를 바로 실행할 수는 없습니다. 하지만 일반적인 상황에서 새로 생성된 프로세스는 바로 실행합니다.

* 유튜브 강의 동영상도 있으니 같이 들으시면 좋습니다. 




#프로세스

프로세스 소개 
프로세스 확인하기  
프로세스는 어떻게 생성할까?  
유저 레벨 프로세스 실행 실습  
커널 스레드  
커널 내부 프로세스의 생성 과정   
프로세스의 종료 과정 분석  
태스크 디스크립터(task_struct 구조체)  
스레드 정보: thread_info 구조체  
프로세스의 태스크 디스크립터에 접근하는 매크로 함수  
프로세스 디버깅  
   * glibc의 fork() 함수를 gdb로 디버깅하기  


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

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


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

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

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


Thanks,
Austin Kim

핑백

덧글

댓글 입력 영역