Kernel) Interrupt, Interrupt handler, Interrupt context
인터럽트와 인터럽트 컨텍스트란 무엇인가?
임베디드 시스템이나 커널 수준의 프로그래밍을 하다 보면 인터럽트(Interrupt)와 인터럽트 컨텍스트(Interrupt Context)라는 개념을 자주 접하게 된다. 이 글에서는 인터럽트가 무엇인지, 인터럽트 컨텍스트란 어떤 의미인지, 그리고 왜 인터럽트 핸들러는 짧게 실행되어야 하는지에 대해 정리한다.
1. 인터럽트란?
인터럽트(Interrupt)는 외부 또는 내부에서 발생한 사건을 CPU에 알리는 신호이다.
이 신호는 CPU가 현재 수행 중인 작업을 잠시 중단하고, 해당 사건을 처리하도록 만든다.
- 외부 인터럽트 예시
- 키보드 입력
- 마우스 클릭
- 네트워크 패킷 수신
- 외부 장치의 상태 변화
- 내부 인터럽트 예시
- 타이머 만료
- 소프트웨어 인터럽트 (softirq)
- 시스템 호출 트랩 (syscall)
- 예외 상황 (예: 0으로 나누기)
각 인터럽트에는 고유 번호(IRQ 번호)가 있으며, 이 번호에 대응하는 인터럽트 핸들러(Interrupt Handler) 함수가 등록되어 있다.
2. 인터럽트 핸들러와 그 실행
인터럽트가 발생하면 커널은 해당 IRQ에 등록된 인터럽트 핸들러를 호출한다. 이 핸들러에는 이벤트에 대한 처리 로직이 구현되어 있으며, 일반적으로 다음과 같은 특성이 있다.
- 유저 모드가 아닌 커널 모드에서 실행된다.
- 커널 스레드가 아닌 CPU에 직접 실행되는 코드이다.
- 실행 도중에는 스케줄링이 일어나지 않는다.
- 스케쥴 함수( schedule() ) 블로킹 함수 사용 불가( msleep(),mutex_lock() ) 만약 실행된다면 커널 패닉이 발생 혹은 에러 로그를 출력
BUG: scheduling while atomic: InputReader/1039/0x00010001
메시지는 인터럽트 핸들러 스케줄링이 금지된 atomic context에서 `schedule()` 또는 블로킹 함수를 호출했을 때 발생한다.
3. 인터럽트 컨텍스트란?
인터럽트 컨텍스트(Interrupt Context)란, CPU가 인터럽트 핸들러를 실행 중인 상태를 의미한다.
- 이 컨텍스트에서는 슬립(sleep), 블로킹(blocking) 연산이 허용되지 않는다.
- 일반적인 커널 스레드와 달리, 현재 태스크의 스케줄링 포인트가 존재하지 않는다.
- 커널은 인터럽트 컨텍스트 중에 다른 작업으로 전환되지 않도록 설계되어 있다.
따라서 인터럽트 핸들러에서는 msleep(), schedule(), mutex_lock() 등의 API를 사용할 수 없다. 이런 함수들은 컨텍스트 전환을 유발할 수 있기 때문이다.
그럼 프로세스 컨텍스트와 비교해보자면
항목 | 프로세스 컨텍스트 | 인터럽트 컨텍스트 |
실행 주체 | 유저 프로세스 or 커널 스레드 | 인터럽트 핸들러 |
스케줄링 | 가능 | 불가능 |
슬립 가능 여부 | 가능 | 불가능 |
4. 인터럽트 핸들러는 왜 짧게 실행되어야 하나?
인터럽트 핸들러는 일반적으로 가능한 한 빨리 종료되어야 한다. 그 이유는 다음과 같다:
- 인터럽트는 스케줄링을 하지 않기 때문에, 실행되는 동안 해당 CPU 코어는 다른 작업을 수행할 수 없다.
- 여러 개의 인터럽트가 동시에 발생했을 때, 하나의 핸들러가 길게 실행되면 우선순위가 낮은 인터럽트가 지연될 수 있다.
- 메인 프로그램 루틴의 실행이 불필요하게 지연될 수 있다.
즉, 인터럽트 핸들러는 정말 필요한 최소한의 작업만 수행하고, 무거운 처리는 다른 방식으로 분리해야 한다.
5. 작업 시간이 걸리는 무거운 작업은 어떻게 처리하는가? (Bottom Half)
긴 작업이 필요한 경우에는 인터럽트 핸들러 내에서 직접 처리하지 않고, 커널이 제공하는 후반부 처리(Bottom Half) 메커니즘을 이용한다. 대표적인 방식은 다음과 같다: ( IRQ = Interrupt Request )
- threaded IRQ : 인터럽트를 처리하는 전용 IRQ 커널 스레드에서 Bottom-half 처리
- Soft IRQ: 인터럽트 핸들러 실행이 끝나면 바로 실행 시작( 여전히 atomic context )
- tasklet: 인터럽트 컨텍스트보다 늦게, softirq로 실행
- workqueue: 커널이 후반부 작업을 큐에 쌓아두고 프로세스 콘텍스트에서 커널 스레드를 통해 하나씩 차례로 수행
이러한 메커니즘은 핸들러는 빠르게 반환하고, 복잡한 처리는 나중에 별도 컨텍스트에서 처리함으로써 시스템 전체 반응성을 높일 수 있다.
6. 정리
- 인터럽트는 CPU가 즉시 처리해야 하는 사건에 대한 반응이다.
- 인터럽트 핸들러는 커널 모드에서 실행되며, 컨텍스트 전환 없이 수행된다.
- 인터럽트 컨텍스트에서는 슬립이나 블로킹이 허용되지 않는다.
- 긴 작업은 bottom half 기법을 이용해 별도로 처리해야 한다.