Top-Half & Bottom-Half 인터럽트 핸들러
Legacy interrupt handler
- 인터럽트 핸들러의 최초 부분은 중첩이 가능하도록 약간의 준비를 하고 그 후에 인터럽트를 enable한 후 나머지에서 처리하도록 처리하였다.
- 주로 인터럽트 중첩이 허용된 펌웨어에서 처리하는 방식이다.
Two part interrupt handler (Top-half & Bottom-half)
- 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)
2) threaded interrupt hanlder
인터럽트 핸들러의 커널 버전별 변천 과정
최근 커널은 가장 빠르게 처리할 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
참고
- Interrupts -1- (Interrupt Controller) | 문c
- Interrupts -2- (irq chip) | 문c
- Interrupts -3- (irq domain) | 문c
- Interrupts -4- (Top-Half & Bottom-Half) | 문c – 현재 글
- Interrupts -5- (Softirq) | 문c
- Interrupts -6- (IPI Cross-call) | 문c
- Interrupts -7- (Workqueue 1) | 문c
- Interrupts -8- (Workqueue 2) | 문c
- Interrupts -9- (GIC v3 Driver) | 문c
- Interrupts -10- (irq partition) | 문c
- Interrupts -11- (RPI2 IC Driver) | 문c
- Interrupts -12- (irq desc) | 문c