Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

16192
888
89789


[리눅스커널] 인터럽트 후반부 처리: IRQ 스레드 소개 6장. 인터럽트 후반부 처리

6.2. IRQ 스레드(threaded IRQ) 소개

리눅스 커널을 익히는 과정에서 만나는 걸림돌 중 하나가 어려운 용어입니다. 어려운 개념을 낯선 용어로 설명하니 이해하기 어려운 것 같습니다. IRQ Thread에 대해 소개하기 전 IRQ란 용어부터 알아볼까요? 

6.2.1 IRQ 스레드(threaded IRQ)란

IRQ는 Interrupt Request의 약자로 하드웨어에서 발생한 인터럽트를 처리 한다는 의미입니다. 조금 더 구체적으로 인터럽트 발생 후 인터럽트 핸들러까지 처리하는 흐름입니다. 

IRQ 스레드란 뭘까요? 인터럽트 핸들러에서는 처리하면 오래 걸리는 일을 수행하는 프로세스입니다. 즉, 인터럽트 후반부 처리를 위한 인터럽트 처리 전용 프로세스입니다. 리눅스 커널에서는 IRQ 스레드를 irq_thread라고도 합니다. 리눅스 커널 커뮤니티에서는 threaded IRQ 방식이라고도 부릅니다. 용어는 달라도 같은 의미입니다. 

IRQ Thread 기법은 인터럽트 후반부 처리를 IRQ Thread에서 수행하는 방식을 의미합니다. 

6.2.2 IRQ 스레드 확인하기

 용어를 간단히 정리했으니 IRQ 스레드에 대해 조금 더 알아 봅시다.
 
라즈베리파이에서 IRQ 스레드 확인하기

라즈베리파이에서는 IRQ 스레드 목록을 어떻게 확인할 수 있을까요? 터미널을 열고 다음과 같이 ps -ely 명령어를 입력하면 프로세스 목록을 확인할 수 있습니다. 
1 root@raspberrypi:/home/pi/dev_raspberrian# ps -ely
2 S   UID   PID  PPID  C PRI  NI   RSS    SZ WCHAN  TTY          TIME CMD
3 S     0     1     0  0  80   0  6012  6750 SyS_ep ?        00:00:02 systemd
4 S     0     2     0  0  80   0     0     0 kthrea ?        00:00:00 kthreadd
...
5 S     0    64     2  0  70 -10     0     0 down_i ?        00:00:00 SMIO
6 S     0    65     2  0   9   -     0     0 irq_th ?        00:00:00 irq/92-mmc1
7 I     0    66     2  0  80   0     0     0 worker ?        00:00:00 kworker/0:3

위 목록에서 6번째 줄을 보면 가장 오른쪽에 irq/92-mmc1가 보입니다. 이 프로세스가 IRQ 스레드입니다. 커널 내부 함수에서 다음 규칙에 따라 이름을 짓습니다.
irq/인터럽트 번호-인터럽트 이름

irq/92-mmc1프로세스는 위 규칙에 따라 어떻게 해석하면 될까요? mmc1이란 이름의 92번째 인터럽트를 처리하는 IRQ 스레드라 말 수 있습니다. 라즈비안에서는 위와 같이 1개의 IRQ 스레드만 볼 수 있습니다. 그런데 다른 리눅스 시스템에서는 보통 10개 이상 IRQ 스레드를 확인할 수 있습니다.

다른 리눅스 시스템에서 IRQ 스레드 소개

이번에는 다른 리눅스 시스템에서 IRQ 스레드를 확인해 보겠습니다. 
다음 로그는 안드로이드를 탑재한 Z5 compact 제품(Snapdragon 810)의 리눅스 개발자 커뮤니티에서 공유된 로그입니다. 
[https://forum.xda-developers.com/z5-compact/general/9-battery-drain-overnight-97-deep-sleep-t3382145/page6]
1  root      14    2     0      0     worker_thr 0000000000 S kworker/1:0H
2  root      15    2     0      0     smpboot_th 0000000000 S migration/2
3  root      16    2     0      0     smpboot_th 0000000000 S ksoftirqd/2
...
4  root      36    2     0      0     rescuer_th 0000000000 S rpm-smd
5  root      38    2     0      0     irq_thread 0000000000 S irq/48-cpr
6  root      39    2     0      0     irq_thread 0000000000 S irq/51-cpr
...
7  root      199   2     0      0     irq_thread 0000000000 S irq/212-msm_dwc
...
8  root      65    2     0      0     irq_thread 0000000000 S irq/261-msm_iom
9  root      66    2     0      0     irq_thread 0000000000 S irq/263-msm_iom
10 root      67    2     0      0     irq_thread 0000000000 S irq/261-msm_iom
11 root      68    2     0      0     irq_thread 0000000000 S irq/263-msm_iom
12 root      69    2     0      0     irq_thread 0000000000 S irq/261-msm_iom
13 root      70    2     0      0     irq_thread 0000000000 S irq/263-msm_iom
14 root      71    2     0      0     irq_thread 0000000000 S irq/261-msm_iom
15 root      72    2     0      0     irq_thread 0000000000 S irq/263-msm_iom
16 root      73    2     0      0     irq_thread 0000000000 S irq/261-msm_iom
17 root      74    2     0      0     irq_thread 0000000000 S irq/263-msm_iom
18 root      75    2     0      0     irq_thread 0000000000 S irq/261-msm_iom

ps 명령어로 출력한 전체 프로세스 중 IRQ 스레드만 검색한 결과입니다. irq_thread 타입으로 볼드체로 표시한 프로세스가 IRQ 스레드입니다. IRQ 스레드 갯수는 14개입니다.

위 로그 중에 “irq/212-msm_dwc”란 IRQ 스레드를 해석하면 msm_dwc란 이름의 212번째 인터럽트를 처리하는 IRQ 스레드라고 볼 수 있습니다. 
7 root      199   2     0      0     irq_thread 0000000000 S irq/212-msm_dwc

이렇게 상용 리눅스 시스템의 IRQ 스레드 개수를 소개한 이유는 라즈베리파이의 라즈비안을 접한 분들은 IRQ 스레드는 1개 밖에 없다고 판단할 수 있기 때문입니다. 사실 라즈비안에서는 IRQ 스레드가 1개 밖에 없습니다. 라즈베리파이에 비해 상용 안드로이드 리눅스 디바이스에서는 IRQ 스레드가 더 많습니다.

IRQ 스레드가 많으면 더 좋은 시스템일까?

IRQ 스레드가 많으면 더 좋은 시스템일까요? 그렇지는 않습니다. 이는 시스템에 인터럽트를 어떻게 설계하고 구성했는지에 따라 다릅니다. 

어떤 인터럽트가 발생하면 인터럽트 핸들러 이후에 실행되는 IRQ 스레드가 있다는 것은 뭘 의미할까요? 해당 인터럽트가 발생하면 소프트웨어적으로 할 일이 많다고 봐야합니다. 인터럽트가 발생했을 때 바로 해야 하는 일은 인터럽트 핸들러에서 처리하고, 조금 후 프로세스 레벨에서 해도 되는 일은 IRQ 스레드에서 수행하는 것입니다.

이번 소절에서는 IRQ 스레드에 대해 소개했으니 이어서 IRQ 스레드를 생성하는 방법에 대해 살펴보겠습니다.


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


# Reference 인터럽트 후반부 처리








6.9 Soft IRQ 서비스는 누가 언제 처리하나?




6.13 Soft IRQ 디버깅
6.13.1 ftrace Soft IRQ 이벤트 분석 방법
6.13.2 /proc/softirqs로 Soft IRQ 서비스 실행 횟수 확인

    핑백

    덧글

    댓글 입력 영역