Interrupts -4- (top-half & bottom-half)

Top-Half & Bottom-Half 인터럽트 핸들러

Legacy interrupt handler

interrupt1

  • 인터럽트 핸들러의 최초 부분은 중첩이 가능하도록 약간의 준비를 하고 그 후에 인터럽트를 enable한 후 나머지에서 처리하도록 처리하였다.
  • 주로 인터럽트 중첩이 허용된 펌웨어에서 처리하는 방식이다.

 

Two part interrupt handler (Top-half & Bottom-half)

interrupt2

  • top-half 부분의 인터럽트 핸들러는 최소한의 일을 수행하고 약간 지연되어 처리되어도 상관 없는 부분은 bottom-half 부분에서 처리되게 하는 기술이다.
  • 리눅스는 처음 bottom half의 구현 시 bottom halves 라는 방법을 사용하였다.

 

threaded interrupt handler

  • 구현된 방식 중 bottom-halves 방식은 deprecate되고 대신 softirqs, tasklet, task queues, work queues 등이 개발되어 사용되기 시작하였다.
  • 리눅스 리얼타임 커널(PREEMPT_RT)에서는 모든 인터럽트 핸들러는 threaded interrupt 방식으로 사용한다.
1) non-preemption (vanila kernel)

interrupt3

2) threaded interrupt hanlder

interrupt4

 

인터럽트 핸들러의 커널 버전별 변천 과정

최근 커널은 가장 빠르게 처리할 hrtimer 인터럽트는 다시 interrupt context로 되돌아와서 처리하고 그 이외의 가장 빠르게 처리해야 할 인터럽트 핸들러들이 softirqs에 동작한다. 그 외의 인터럽트 핸들러 들은 별도의 스레드에서 work queues를 통해 동작시킨다.

 

컴포넌트별 특징

  • Interrupt context
    • 처음 진입되면 새로운(nested) 인터럽트를 받아들일 준비를 하는 부분과  bottom half context로 데이터를 전달하는 부분으로 나뉜다.
    • sleep API의 사용이 불가능하며 최대한 빠르게 처리를 완료하고 복귀하도록 되어 있다.
  • Bottom halves
    • bottom half 구조의 첫 구현으로 한 번에 하나의 인터럽트 처리만 가능하다. core가 여러 개 있을 때에도 한 번에 하나씩만 처리하는 단점이 있다.
    • sleep API의 사용이 불가능하다.
  • Task queues
    • Bottom halves에 등록된 인터럽트 핸들러 중 특별히 느리게 처리되는 것들을 별도의 스레드에서 처리하도록 구현하였다.
    • process context에서 처리된다.
    • sleep API가 사용 가능하다.
  • Softirqs
    • 빠른 처리를 위해 구현된 인터럽트 핸들러가 각각의 코어에서 동작 가능하게 설계되었다.
    • 디바이스 드라이버 등에서 dynamic 하게 추가할 수 없고 빠르게 처리할 주요 인터럽트 핸들러들만 포함되었다.
    • bottom-half로 구분되어 있지만 interrupt context 및 process context 모두에서 호출될 수 있는 특성을 가지고 있다.
    • sleep API의 사용이 불가능하다.
    • 최근 커널 v4.10에서 이용하는 컴포넌트
      • 타이머, 네트워크, 블럭디바이스, tasklet, 스케쥴러, rcu 처리
  • Tasklet
    • 같은 타입을 사용하는 tasklet은 멀티 코어일지라도 한 번에 하나만 동작한다.
    • 사용자가 인터럽트 핸들러를 dynamic 하게 추가할 수 있다.
    • softirq에 구현되어 bottom-half로 구분되어 있지만 interrupt context 및 process context 모두에서 호출될 수 있는 특성을 가지고 있다.
      • 현재는 Tasklet이 없어지고 Softirqs에 포함되었다. 단 API 레퍼되어 그대로 사용할 수 있게 하였다.
    • sleep API의 사용이 불가능하다.
    • 참고: Eliminating tasklets | LWN.net
  • Work queues
    • Task queues를 대체하여 개발되었다.
    • process context에서 처리된다.
    • 각각의 코어에서 처리하다 최근에는 pool 개념으로 동시 수행개념이 도입되었다. (Concurrency Managed Work Queues)
    • 참고: Concurrency-managed workqueues | LWN.net

 

참고

 

댓글 남기기