인터럽트 처리 구조와 우선순위 제어

인터럽트의 요청·우선순위·서비스 루틴 구조와 처리 흐름, 벡터 테이블, 예외 및 최적화 방식을 정리한다.

2026-08-14 · 최초 발행 2025-12-28

실행을 멈춘 CPU가 이벤트를 처리하는 방식

인터럽트는 프로그램이 실행되는 도중 예상하지 못한 상황이 생겼을 때 현재 작업을 잠시 멈추고, 필요한 처리를 끝낸 뒤 중단 지점으로 돌아오는 메커니즘이다. 하드웨어나 소프트웨어 신호로 발생하며 비동기 이벤트 처리와 우선순위 기반 처리를 지원한다.

이 구조가 있으면 CPU는 I/O를 기다리는 동안 다른 작업을 수행할 수 있고, 시스템 오류와 예외 상황에도 빠르게 대응할 수 있다. 긴급 이벤트를 즉시 처리해야 하는 환경에서도 반응성을 확보할 수 있다.

프로그램 실행인터럽트 발생현재 상태 저장ISR 실행상태 복원프로그램 재개

요청 신호, 우선순위, 처리 루틴

IRQ(Interrupt Request)는 인터럽트 발생을 알리는 신호다. 키보드·마우스·타이머 같은 하드웨어 장치뿐 아니라 시스템 콜과 예외를 일으키는 소프트웨어 명령도 발생원이 될 수 있다. 장치마다 고유한 IRQ 번호를 배정할 수 있고, 여러 IRQ가 동시에 발생할 수도 있다.

IPR(Interrupt Priority Register)은 인터럽트 우선순위를 저장하고 관리하는 하드웨어 레지스터다. 우선순위를 비교하고 중첩 인터럽트를 제어하며, 특정 인터럽트를 차단하는 마스킹도 담당한다.

ISR(Interrupt Service Routine)은 인터럽트 원인을 실제로 처리하는 프로그램이며 Interrupt Handler라고도 한다. 종류별로 별도 루틴을 두고, 가능한 짧고 빠르게 실행되도록 구성한다. 재진입 가능하도록 설계할 수 있으며 주소는 인터럽트 벡터 테이블(IVT)에 저장된다.

신호우선순위 비교YesNoIRQ (요청)CPUIPR (우선순위)현재 작업보다 높은가?상태 저장대기/무시IVT 조회ISR 실행상태 복원

발생 위치에 따라 나뉘는 인터럽트

외부 인터럽트는 CPU 바깥의 하드웨어에서 발생한다. 전원 공급 이상에는 정전과 전압 불안정이 포함되며, 최고 우선순위로 즉시 저장과 시스템 종료를 수행한다. 기계적 오류는 CPU 내부 하드웨어 오류, 패리티 에러, 버스 에러와 관련된다. 외부 신호에는 타이머 만료와 Ctrl+C 등의 오퍼레이터 개입이 있고, 입출력 인터럽트는 키보드·마우스·디스크 같은 주변 장치의 작업 완료나 오류를 알린다.

내부 인터럽트는 CPU가 프로그램을 실행하는 과정에서 발생한다. 프로그램 검사는 Division by Zero, Overflow/Underflow, 잘못된 메모리 접근, 불법 명령어를 포함한다. SVC(Supervisor Call)는 사용자 프로그램이 OS 서비스에 요청하는 시스템 콜로, 의도적으로 발생시키는 인터럽트다.

인터럽트외부 인터럽트내부 인터럽트전원 공급 이상기계적 오류외부 신호입출력프로그램 검사SVC

어떤 요청을 먼저 받을 것인가

우선순위 체계는 전원 공급 이상을 최우선으로 두고, CPU 기계적 오류, 외부 신호, 입출력, 프로그램 검사, SVC 순서로 처리한다. SVC는 최하위다.

우선순위를 결정하는 방법은 소프트웨어와 하드웨어 방식으로 나뉜다. Polling에서는 CPU가 모든 IRQ 라인을 순차적으로 검사하고 우선순위 순서대로 폴링한다. 구현이 간단하고 저렴하지만 응답 시간이 느리고 CPU 오버헤드가 있다.

Daisy-Chain은 장치를 직렬로 연결한다. CPU가 인터럽트 확인 신호(IACK)를 보내면 첫 번째 장치부터 차례로 확인하고, 요청한 장치가 신호를 가로채 벡터를 제공한다. 배선이 간단하고 확장하기 쉽지만 체인 끝 장치의 응답은 느려질 수 있다.

Parallel/Mask Register 방식은 IRQ마다 독립적인 라인을 두고 모든 IRQ를 병렬 비교한다. 하드웨어 우선순위 인코더가 최고 우선순위를 즉시 선택하며, 특정 IRQ를 마스크해 중첩 인터럽트도 제어할 수 있다. 응답이 빠르고 우선순위가 정확한 대신 하드웨어가 복잡하고 비용이 증가한다.

ParallelCPUPriority EncoderIRQ 0IRQ 1IRQ 2IRQ 3Daisy-ChainIACKCPUDevice 1Device 2Device 3Device 4

상태를 보관하고 원래 실행으로 복귀하는 흐름

처리는 장치 또는 프로그램이 IRQ 신호를 발생시키면서 시작된다. CPU는 현재 명령어를 끝낸 뒤 IRQ를 확인하고 Interrupt Enable Flag를 검사한다. IPR로 우선순위를 비교해 현재 작업보다 높은 요청이면 이를 수용한다.

이후 CPU는 PC, PSW, General Purpose Registers를 스택에 저장한다. IVT에서 해당 인터럽트의 ISR 주소를 읽어 루틴으로 이동하고, 인터럽트 원인을 처리한다. ISR은 장치 상태를 리셋하고 필요하면 데이터를 처리한다. 처리가 끝나면 스택에서 저장 상태를 복원해 중단된 위치의 프로그램 실행을 계속한다.

ISR인터럽트 벡터 테이블스택CPU프로그램ISR인터럽트 벡터 테이블스택CPU프로그램IRQ 발생명령어 실행 중현재 명령어 완료우선순위 확인PC, PSW, Registers 저장ISR 주소 조회ISR 주소점프 및 실행인터럽트 처리완료상태 복원PC, PSW, Registers실행 재개

대기열과 스택으로 보는 처리 순서

LCFS(Last Come First Served)는 마지막에 도착한 인터럽트를 먼저 처리한다. 중첩 인터럽트를 허용하고 스택 구조를 사용하므로 긴급한 최신 이벤트를 우선할 수 있다. 반면 먼저 발생한 인터럽트의 대기 시간은 길어질 수 있다.

FCFS(First Come First Served)는 먼저 도착한 인터럽트부터 처리한다. 일반적으로 중첩 인터럽트를 허용하지 않고 큐 구조를 사용한다. 공정성과 예측 가능성이 장점이지만, 긴급 이벤트가 지연될 수 있다.

FCFS (큐)처리 순서IRQ 1IRQ 2IRQ 3LCFS (스택)처리 순서IRQ 1IRQ 2IRQ 3

IVT가 ISR 주소를 찾는 방법

인터럽트 벡터 테이블(IVT)은 각 인터럽트에 대응하는 ISR 주소를 보관하는 테이블이다. 일반적으로 메모리 하위 주소처럼 고정된 위치에 놓이며, 인터럽트 번호와 ISR 주소를 배열 형태로 매핑한다. CPU는 인터럽트 번호를 인덱스로 사용해 엔트리를 찾고, 그 주소로 점프한다.

x86에서는 0x0000 ~ 0x03FF에 1KB, 256개 벡터를 둔다. ARM은 VBAR(Vector Base Address Register)로 위치를 지정한다.

인터럽트 벡터 테이블인터럽트 발생0x0000: ResetReset ISR 주소0x0004: UndefinedUndefined ISR 주소0x0008: SWISWI ISR 주소0x000C: PrefetchPrefetch ISR 주소0x0010: Data AbortData Abort ISR 주소0x0018: IRQIRQ ISR 주소0x001C: FIQFIQ ISR 주소CPUISR 코드

외부 이벤트, 실행 오류, 의도적 호출의 차이

인터럽트는 I/O 완료나 타이머처럼 외부 이벤트에서 발생한다. 비동기적이며 언제 발생할지 예측하기 어렵다.

예외(Exception)는 내부 프로그램 오류에서 발생한다. 특정 명령어와 연관된 동기적 상황으로, Division by Zero와 Page Fault가 예다.

트랩(Trap)은 의도적으로 발생시키는 소프트웨어 인터럽트다. 시스템 콜과 디버깅에 사용되며 SVC와 INT 명령어가 이에 해당한다.

응답 시간과 인터럽트 오버헤드 조절

FIQ(Fast Interrupt)는 최고 우선순위의 고속 인터럽트다. 전용 레지스터 세트를 사용해 Context Saving을 최소화하고 빠른 응답 시간을 확보하므로 실시간 제어와 긴급 이벤트에 활용된다.

Interrupt Coalescing은 여러 이벤트를 하나의 인터럽트로 통합해 인터럽트 오버헤드를 줄이는 방식이다. 네트워크 카드와 고속 I/O에서 활용한다.

Interrupt Throttling은 단위 시간당 인터럽트 수를 제한해 Interrupt Storm을 방지한다. 네트워크 트래픽이 폭주할 때 적용할 수 있다.

아키텍처별 구현 사례

x86 인터럽트의 벡터 범위는 0255다. 이 중 031은 CPU 예외에 예약되고, 32~255는 사용자 정의에 사용한다. 주요 벡터에는 0의 Division Error, 8의 Double Fault, 13의 General Protection, 14의 Page Fault가 있다.

ARM은 일반 인터럽트인 IRQ와 고속 인터럽트인 FIQ를 구분한다. 벡터는 고정 주소 또는 VBAR 기반으로 설정한다.

ARM Cortex-M 시리즈의 NVIC(Nested Vectored Interrupt Controller)는 256개 우선순위 레벨을 제공하며, 중첩 인터럽트를 자동으로 관리한다.

인터럽트운영체제컴퓨터구조ISR예외 처리