Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

130199
1107
135858


[리눅스커널] 프로세스: 커널 스레드의 종류 4. 프로세스(Process) 관리


리눅스는 다양한 배포판에서 구동됩니다. 그런데 어떤 리눅스 시스템에서도 볼 수 있는 커널 스레드가 있습니다.

라즈베리 파이에서 커널 스레드 항목 확인

먼저 커널에서 구동 중인 대표적인 커널 스레드를 확인해 봅시다. 라즈베리 파이에서 터미널을 열고 ‘ps -ejH’ 명령어를 입력합니다.

root@raspberrypi:/home/pi# ps -ejH
1 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
2     0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
3     2     4     0     0 ?           -1 I<       0   0:00  \_ [kworker/0:0H]
4     2     7     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/0]
5     2    10     0     0 ?           -1 S        0   0:00  \_ [migration/0]
6     2    11     0     0 ?           -1 S        0   0:00  \_ [cpuhp/0]
7     2    12     0     0 ?           -1 S        0   0:00  \_ [cpuhp/1]
8     2    13     0     0 ?           -1 S        0   0:00  \_ [migration/1]
9     2    14     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/1]
..
 10   2    66     0     0 ?           -1 S        0   0:00  \_ [irq/86-mmc1]

위와 같은 출력 결과가 커널 스레드 목록입니다. 그러면 커널 스레드가 각각 무엇인지 살펴볼까요? 

kthreadd 프로세스

    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]

kthreadd 프로세스는 모든 커널 스레드의 부모 프로세스입니다. 스레드 핸들 함수는 kthreadd()이며, 커널 스레드를 생성하는 역할을 수행합니다.

이번에는 커널 스레드의 핸들 함수에 대해 설명하겠습니다.

커널 스레드는 일반 프로세스와 달리 프로세스가 실행하고 휴면 상태에 진입하는 세부 동작을 커널 함수를 사용해 구현해야 합니다. 또한 커널 스레드를 생성할 때 호출하는 kthread_create() 함수의 1번째 인자로 커널 스레드 핸들 함수를 지정해야 합니다.

다음은 kthread_create() 함수의 선언부로서, 커널 스레드 핸들 함수를 지정하는 threadfn 인자가 보입니다. 

https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/kthread.h
01 #define kthread_create(threadfn, data, namefmt, arg...) \
02 kthread_create_on_node(threadfn, data, NUMA_NO_NODE, namefmt, ##arg)

커널 스레드의 세부적인 동작은 커널 스레드 핸들 함수에 구현돼 있어서 커널 스레드를 처음 접할 때 먼저 커널 스레드 핸들 함수를 분석합니다.

워커 스레드

    2     4     0     0 ?           -1 I<       0   0:00  \_ [kworker/0:0H]

워크큐에서 요청된 워크(Work)를 실행하는 프로세스입니다. 스레드 핸들 함수는 worker_thread()이며, process_one_work() 함수를 호출해서 워크를 실행하는 기능을 수행합니다.

ksoftirqd 프로세스

    2     7     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/0]

ksoftirqd 스레드는 이름과 같이 Soft IRQ를 위해 실행하는 프로세스입니다. ksoftirqd 스레드는 smp_boot 형태의 스레드이며, 프로세스 이름의 맨 오른쪽에서 실행 중인 CPU 번호를 볼 수 있습니다. 예를 들어, 'ksoftirqd/1' 프로세스는 CPU1에서만 실행되고 'ksoftirqd/3' 프로세스는 CPU3에서만 구동됩니다.

ksoftirqd 스레드 핸들은 run_ksoftirqd() 함수로서 Soft IRQ 서비스를 실행합니다. Soft IRQ 서비스를 처리하는 _do_softirq() 함수에서 ksoftirqd를 깨웁니다.

irq/86-mmc1 스레드

    2    66     0     0 ?           -1 S        0   0:00  \_ [irq/86-mmc1]

IRQ 스레드라고 하며, 인터럽트 후반부 처리를 위해 쓰이는 프로세스입니다. IRQ 스레드의 이름은 다음과 같은 규칙으로 정해집니다. 

["irq"/"인터럽트번호"-"인터럽트이름"]

프로세스의 이름으로 IRQ 스레드가 어떤 기능인지 유추할 수 있습니다. 예를 들어, 앞에서 본 '[irq/86-mmc1]' IRQ 스레드는 86번 mmc1 인터럽트 후반부를 처리하는 IRQ 스레드라고 해석할 수 있습니다.

대표적인 커널 스레드를 소개했으니 다음 절에서 커널 스레드를 어떻게 생성하는지 알아봅시다.

 
#프로세스

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


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

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






핑백

덧글

댓글 입력 영역