인터럽트 벡터 테이블과 ISR
인터럽트는 IRQ(Interrupt ReQuest)라고 하는 하드웨어 전기신호로 회로의 버스(bus)를 통해 CPU에 전달된다.
이 때 사전에 작성된 인터럽트 벡터 테이블(interrupt vector table)을 참조하여 발생된 인터럽트에 해당하는 핸들러를 호출하게 된다. 호출되는 함수는 ISR(Interrupt Service Routine) 또는 인터럽트 핸들러(interrupt handler)라고 불린다.
ISR은 지터(jitter)로 인한 동시성(concurrency) 저해 또는 문맥 교환 오버헤드(context switch overhead) 등 많은 이슈가 있어 실행시간이 최소화 되도록 작성하라고 권장된다. 그럼에도 불구하고 처리 시간이 길어지거나 인터럽트가 많이 발생하는 상황이 있을 수 있기 때문에, 현대의 운영체제에서는 인터럽트를 두 단계로 나누어 처리하기도 한다.
두 단계는 각각 FLIH(First-Level Interrupt Handler)와 SLIH(Second-Level Interrupt Handler)로 불린다. FLIH에서 필수적인 작업만 최소한으로 처리한 뒤 SLIH로 넘겨 나머지를 처리한다. SLIH는 커널 스레드(thread)가 실행시키는데, 사용자 프로세스처럼 스케줄러(scheduler)가 CPU를 할당할 때까지 대기해야 한다. 따라서 실행 시작 시간과 완료 시간의 보장이 안된다는 것을 유념해야 한다.