ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인터럽트 후반부 처리
    Linux/Linux Kernel 2020. 8. 16. 17:06

    디바이스 드라이버에서 등록된 대부분의 함수들은 다른 인터럽트를 금지시킨 상태로 수행하기 때문에 인터럽트 핸들러를 구현할 때는 가급적 빠르게 처리하고 종료하도록 만들어야 한다. 하지만 디바이스 드라이버의 인터럽트 핸들러를 작성하다 보면 복잡한 연산을 수행할 수 밖에 없다. 그럼 어떻게 해야할까? 바로 꼭 필요한 데이터 처리 또는 빨리 실행되어야할 코드는 인터럽트 핸들러에서 처리하도록 하고, 시간이 걸리는 복잡한 연산 또는 실시간으로 빨리 실행하지 않아도 되는 코드은 인터럽트 핸들러가 종료된 이후에 처리하도록 구성하면된다.

     

    이 인터럽트 핸들러가 종료된 이후에 처리하는것이 인터럽트 후반부 처리다. 

     

    Q. 그럼 어떠한 인터럽트 후반부 처리 방법을 사용해야할까?

     

    A. 어떠한 인터럽트 후반부 처리를 사용할지를 결정하려면 각 인터럽트 후반부 처리가 언제, 어떻게 실행되는지를 알아야한다.

     

    IRQ 스레드

    IRQ 스레드 실행 흐름

    1. [인터럽트 컨텍스트] 인터럽트 핸들러에서 IRQ_WAKE_THREAD를 반환
    2. [인터럽트 컨텍스트] 실행하고 싶은 IRQ 스레드를 깨움
    3. [프로세스 컨텍스트] 인터럽트 서비스 루틴 종료
    4. [프로세스 컨텍스트] 스케줄러에 의해 커널 스레드(*IRQ 스레드)는 실행
    5. [프로세스 컨텍스트] 커널 스레드의 IRQ 스레드 핸들러(irq_thread() 함수) 실행
    6. [프로세스 컨텍스트] IRQ 스레드 핸들러에서 IRQ 스레드 처리 함수 실행

     

    ※ IRQ 스레드는 실시간 프로세스이므로 다른 프로세스보다 우선순위가 높다. 그래서 자주 실행되면 일반 프로세스가 실행을 못해 전체적인 시스템 저하가 발생한다.

     

    특징

    1. IRQ 스레드는 프로세스 컨텍스트에서 후반부 처리를 한다.

     

    Soft IRQ

    Soft IRQ 실행 흐름

    1. [인터럽트 컨텍스트] 인터럽트 핸들러에서 Soft IRQ 서비스 요청(raise_softirq())
    2. [인터럽트 컨텍스트] 요청된 Soft IRQ 서비스 확인 후 Soft IRQ 서비스 실행
    3. [인터럽트 컨텍스트] Soft IRQ 서비스의 실행 시간 체크
    4. [인터럽트 컨텍스트] 기준 이상으로 실행했으면 ksoftirqd 스레드를 깨움
    5. [프로세스 컨텍스트] 인터럽트 서비스 루틴 종료
    6. [프로세스 컨텍스트] 스케줄러에 의해 커널 스레드(ksoftirqd 스레드) 실행
    7. [프로세스 컨텍스트] 커널 스레드의 Soft IRQ 서비스 실행

     

    특징

    1. Soft IRQ는 인터럽트 컨텍스트와 프로세스 컨텍스트에서 후반부 처리를 한다.
    2. 인터럽트 핸들러 실행이 끝나면 바로 후반부 처리를 시작한다.
    3. 인터럽트 컨텍스트에서 Soft IRQ 서비스를 실행 도중 시간이 오래 걸리면 Soft IRQ를 종료하고 프로세스 컨텍스트에서 Soft IRQ 서비스를 처리한다.
    4. 커널 타미어는 Soft IRQ로 동작된다.
    5. 반응 속도에 민감한 네트워크 패킷 처리나 고속 그래픽 처리 및 스토리지 드라이버들은 Soft IRQ 서비스를 이용해서 구현됬다.
    6. 인터럽트 발생빈도가 높거나 후반부 처리를 빨리 실행해야 할 때 사용한다.(인터럽트 핸들로 호출 이후 바로 Soft IRQ 서비스를 실행하기 때문)

     

     

    태스크릿

    태스크릿 실행 흐름

    1. [인터럽트 컨텍스트] 인터럽트 핸들러에서 TASKLET Soft IRQ 서비스 요청(tasklet_schedule()) 
    2. [인터럽트 컨텍스트] 요청된 Soft IRQ 서비스 확인 후 Soft IRQ 서비스(태스크릿 서비스, tasklet_action()) 실행
    3. [인터럽트 컨텍스트] Soft IRQ 서비스에서 태스크릿 핸들러 호출
    4. [인터럽트 컨텍스트] Soft IRQ 서비스의 실행 시간 체크
    5. [인터럽트 컨텍스트] 기준 이상으로 실행했으면 ksoftirqd 스레드를 깨움
    6. [프로세스 컨텍스트] 인터럽트 서비스 루틴 종료
    7. [프로세스 컨텍스트] 스케줄러에 의해 커널 스레드(ksoftirqd 스레드) 실행
    8. [프로세스 컨텍스트] 커널 스레드의 Soft IRQ 서비스 실행
    9. [프로세스 컨텍스트] Soft IRQ 서비스에서 태스크릿 핸들러 호출

     

    특징

    1. 태스크릿은 Soft IRQ 서비스 중 하나로 *동적으로 Soft IRQ 서비스를 쓸 수 인터페이스다. 그래서 Soft IRQ랑 거의 동일하다.
    2. Soft IRQ로 처리하고 싶으면 태스크릿으로 처리하면된다.

    ※ 동적으로 실행하기 때문에 함수가 1:N 대응되기 위해 Soft IRQ 서비스가 실행이되고 핸들러를 한번 더 수행한다.

     

    워크큐

    워크큐 실행 흐름

    1. [인터럽트 컨텍스트] 인터럽트 핸들러에서 워크를 워크큐에 큐잉(schedule_work())
    2. [인터럽트 컨텍스트] 워커 스레드를 깨움(wake_up_worker())
    3. [프로세스 컨텍스트] 인터럽트 서비스 루틴 종료
    4. [프로세스 컨텍스트] 스케줄러에 의해 커널 스레드(워커 스레드) 실행
    5. [프로세스 컨텍스트] 커널 스레드의 워커 스레드 핸들러 실행(worker_thread())
    6. [프로세스 컨텍스트] 워커 스레드 핸들러에서 워크(워크 핸들러) 실행

     

    특징

    1. 워크큐는 프로세스 컨텍스트에서 후반부 처리를 한다.
    2. 워크를 워크큐에 큐잉하고 워크를 깨우는 시간이 오래 걸린다.
    3. 워크큐를 실행하는 워커 스레드는 일반 프로세스다. 그래서 우선순위가 높은 프로세스가 오면 선점될 수 있다. 일반프로세스 우선순위보다 높은 우선순위의 워커 스레드를 이용할 수도 있다.(system_highpri)
    4. 워커 스레드가 워커(워크 아니고?)를 실행할 때는 언제든 휴면이 가능하다. 스케줄링을 지원하는 모든 커널 함수를 사용할 수 있다.
    5. 워크큐는 실행 시각에 민감하지 않을때 사용한다.

     

    위 특징을 가지고 상황별

     

    인터럽트가 자주 발생하는 경우

    • IRQ 스레드로 후반부 처리를 하면 IRQ 스레드가 우선순위가 높아 자주 실행이 될것이고 일반 프로세스는 선점될 수 없어 시스템 반응 속도가 느려진다.
    • Soft IRQ로 후반부 처리를 하면
    • 워크큐로 후반부 처리를 하면 일반 프로세스로 동작하지만 워크를 워크큐에 큐잉하고 워크를 깨우는 시간이 오래걸리기 때문이 시스템 반응 속도가 느려진다.

    시스템에 인터럽트 개수가 많은 경우

    • IRQ 스레드를 사용한다.

    자주 발생하는것도 아니고 빨리 실행해야하는것도아닌 경우

    • 워크큐를 사용한다.

     

     

    Q. 인터럽트 핸들러에서 어떠한 코드를 작성하면 안될까?

     

    A. 스케줄링을 지원하는 함수를 사용하면 안된다. 인터럽트 컨텍스트에서 schedule() 함수를 호출해 스케줄링을 시도하거나 뮤텍스를 사용하면 휴면상태에 진입할 수 있기 때문에 커널은 이를 감지하고 커널 패닉을 유발할 수 있다.

     

     

     

     

    그럼 이제 어떻게 생성하고 어떻게 실행되는지 자세하게 알아보자

     

    IRQ 스레드

    johnjarrer.tistory.com/126

     

    인터럽트 후반부 처리 / IRQ 스레드

     

    johnjarrer.tistory.com

     

    Soft IRQ

    johnjarrer.tistory.com/127

     

    인터럽트 후반부 처리 / Soft IRQ

     

    johnjarrer.tistory.com

    태스크릿

    johnjarrer.tistory.com/128

     

    인터럽트 후반부 처리 / 태스크릿

     

    johnjarrer.tistory.com

    워크큐

    johnjarrer.tistory.com/129

     

    인터럽트 후반부 처리 / 워크큐

     

    johnjarrer.tistory.com

     

     

     

    틀린 점이 있다면 댓글 부탁드리겠습니다. 감사합니다.

    'Linux > Linux Kernel' 카테고리의 다른 글

    인터럽트 후반부 처리 / Soft IRQ  (0) 2020.09.13
    인터럽트 후반부 처리 / IRQ 스레드  (0) 2020.09.13
    인터럽트  (0) 2020.08.16
    프로세스  (0) 2020.08.16
    메모리 관리  (0) 2020.08.16

    댓글

Designed by Tistory.