Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

19113
1478
166889


[리눅스커널] 프로세스: 커널 프로세스 생성 시 _do_fork() 함수의 흐름 4. 프로세스(Process) 관리

커널 프로세스를 생성할 때도 _do_fork() 함수를 호출합니다. 그럼 커널 프로세스란 무엇일까요? 커널 프로세스란 시스템 콜 없이 커널 함수로 생성되어 커널 공간에서만 실행되는 프로세스를 의미합니다. 커널 프로세스의 대표적인 예로 커널 스레드를 들 수 있습니다. 커널 스레드는 커널 공간에서 시스템 리소스(메모리, 전원) 관리를 수행합니다.

다음 그림을 보면서 커널 스레드와 같은 커널 프로세스를 어떻게 생성하는지 알아보겠습니다.

 
그림 4.3 커널 스레드의 생성 흐름도

보다시피 커널 스레드의 생성 과정은 2단계로 나눌 수 있습니다.

1단계: kthreadd 프로세스에게 커널 프로세스 생성을 요청
kthread_create() 함수를 호출해 kthreadd 프로세스에게 커널 프로세스 생성을 요청합니다. 그리고 kthreadd 프로세스를 깨웁니다.

2단계: 커널 프로세스 생성
kthreadd 프로세스는 깨어나 자신에게 커널 프로세스 생성 요청을 했는지 점검합니다. 프로세스를 생성해달라는 요청이 있으면 프로세스를 생성합니다.

이어서 커널 스레드를 생성하는 예제 코드를 봅시다.

https://elixir.bootlin.com/linux/v4.19.30/source/drivers/vhost/vhost.c 
1 long vhost_dev_set_owner(struct vhost_dev *dev)
2 {
3 struct task_struct *worker;
4 int err;
...
5 /* No owner, become one */
6 dev->mm = get_task_mm(current);
7 worker = kthread_create(vhost_worker, dev, "vhost-%d", current->pid);

7 번째 줄에서 kthread_create() 함수를 실행하면 커널 스레드를 생성할 수 있습니다. kthread_create() 함수를 호출하면 커널 스레드를 생성하는 kthreadd 프로세스에게 커널 스레드 생성 요청을 합니다. 이후 kthreadd 스레드는 _do_fork() 함수를 실행해서 프로세스를 생성합니다.

이처럼 커널 스레드도 프로세스의 한 종류라 볼 수 있습니다. 그런데 여기서 한 가지 의문이 생깁니다. 커널 스레드는 언제 실행을 시작할까요?

커널은 시스템 부팅 과정에서 대부분의 커널 스레드를 생성합니다. 커널 스레드는 생성된 후 바로 일을 시작하며, 이후 배경 작업으로 주기적으로 실행됩니다. 대표적인 예로 워커 스레드를 들 수 있습니다. 

하지만 모든 커널 스레드가 부팅 과정에서만 생성되는 것은 아닙니다. 커널이 동적으로 커널 스레드가 필요하다고 판단할 때 커널 스레드를 생성할 때도 있습니다. 두 가지 예를 들어볼까요? 

1. 리눅스 드라이버에서 많은 워크를 워크큐에 큐잉하면 커널은 커널 스레드의 종류인 워커 스레드를 더 생성한다.
2. 커널에서 메모리가 부족하면 페이지를 확보하는 일을 하는 kswapd 스레드를 깨워 실행합니다. 

보통 리눅스 커널 시스템이 더 많은 일을 해야 할 때 커널 스레드를 생성합니다.

이번 시간에는 프로세스 생성 과정을 알아봤습니다. 이어지는 절에서는 라즈베리 파이에서 유저 공간에서 실행 중인 프로세스를 점검해봅시다.


#프로세스

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


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

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


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

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

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













핑백

덧글

댓글 입력 영역