인터럽트 (Interrupt)
한눈에 보기
CPU가 하던 일을 멈추고 긴급한 사건을 먼저 처리하게 하는 인터럽트를 다룬다. 폴링과의 비교, 하드웨어 인터럽트와 예외와 트랩의 구분, 처리 절차와 상반부 하반부, 타이머 인터럽트와 멀티태스킹의 관계를 정리한다.
최종 업데이트 2026.09.17
인터럽트(Interrupt)는 CPU가 현재 실행 중인 작업을 잠시 멈추고 긴급한 사건을 먼저 처리하도록 하드웨어나 소프트웨어가 보내는 신호다. 키보드 입력, 디스크 작업 완료, 타이머 만료 같은 사건이 발생하면 CPU는 하던 일을 저장한 뒤 해당 사건의 처리 루틴으로 점프한다. 운영체제가 장치를 효율적으로 다루고 멀티태스킹을 구현하는 근간이 되는 메커니즘이다.
폴링 대신 인터럽트를 쓰는 이유
CPU가 장치 상태를 주기적으로 확인하는 방식을 폴링(polling)이라고 한다. 폴링은 구현이 단순하지만 사건이 없을 때도 CPU가 계속 확인 작업에 시간을 쓰고, 확인 주기 사이에 발생한 사건은 처리가 늦어진다. 인터럽트는 반대로 장치가 필요할 때만 CPU를 부르는 방식이라 CPU는 사건이 없는 동안 다른 일을 할 수 있다.
| 구분 | 폴링(Polling) | 인터럽트(Interrupt) |
|---|---|---|
| 주도권 | CPU가 장치를 반복 확인 | 장치가 CPU에 통지 |
| CPU 낭비 | 사건이 없어도 확인 비용 발생 | 사건이 있을 때만 비용 발생 |
| 반응 지연 | 확인 주기에 좌우됨 | 거의 즉시 반응 |
| 유리한 상황 | 사건이 매우 잦아 통지 오버헤드가 더 클 때 | 사건이 드물거나 불규칙할 때 |
고속 네트워크 카드처럼 패킷이 쉴 새 없이 도착하는 환경에서는 인터럽트가 오히려 폭주해 처리 비용이 커지므로, 인터럽트로 시작하되 부하가 높으면 일시적으로 폴링으로 전환하는 혼합 기법(리눅스의 NAPI 등)도 쓰인다.
인터럽트의 종류
하드웨어 인터럽트(hardware interrupt)는 CPU 외부 장치가 인터럽트 요청선(IRQ, Interrupt Request)을 통해 비동기적으로 발생시키는 것으로, 타이머, 키보드, 디스크 컨트롤러, 네트워크 카드가 대표적이다. 소프트웨어 쪽에서는 실행 중인 명령이 원인이 되어 동기적으로 발생하는 예외(exception)가 있다. 0으로 나누기, 잘못된 메모리 접근에 따른 페이지 폴트(page fault), 유효하지 않은 명령 실행 등이 여기에 속한다. 또한 응용 프로그램이 운영체제 서비스를 요청할 때 의도적으로 발생시키는 트랩(trap)이 있으며, 시스템 콜(system call)이 이 방식으로 커널에 진입한다. 예외는 같은 명령을 다시 실행하면 같은 지점에서 다시 발생하는 동기적 사건이고, 하드웨어 인터럽트는 실행 중인 명령과 무관하게 아무 때나 도착하는 비동기적 사건이라는 점이 중요한 차이다.
인터럽트 처리 과정
인터럽트가 도착하면 대략 다음 순서로 처리된다.
- CPU는 현재 명령의 실행을 마친 뒤 인터럽트 발생을 확인한다.
- 현재 실행 문맥의 복귀에 필요한 최소 정보(프로그램 카운터, 상태 레지스터 등)를 저장한다.
- 인터럽트 번호로 인터럽트 벡터 테이블(interrupt vector table)을 조회해 해당 처리 루틴의 주소를 얻는다.
- 인터럽트 서비스 루틴(ISR, Interrupt Service Routine)이 커널 모드에서 실행되어 장치를 처리한다.
- 저장해 둔 문맥을 복원하고 중단됐던 지점 또는 스케줄러가 고른 다른 작업으로 복귀한다.
여러 장치가 동시에 인터럽트를 걸 수 있으므로 인터럽트 컨트롤러가 우선순위를 정해 전달하고, 더 급한 인터럽트가 처리 중인 인터럽트를 다시 중단시키는 중첩(nesting)도 허용된다. 짧은 임계 처리 구간에서는 인터럽트를 잠시 비활성화(masking)하기도 한다. 멀티코어 시스템에서는 어느 코어가 어떤 인터럽트를 받을지 분배하는 문제가 추가되며, 특정 장치의 인터럽트를 특정 코어에 고정하는 인터럽트 친화도(IRQ affinity) 설정으로 캐시 효율과 부하 균형을 조절한다.
인터럽트는 직접 메모리 접근(DMA, Direct Memory Access)과 짝을 이뤄 입출력 효율을 완성한다. DMA 컨트롤러는 CPU 개입 없이 장치와 메모리 사이에서 데이터를 직접 옮기고, 전송이 모두 끝났을 때 한 번만 인터럽트를 걸어 완료를 알린다. DMA가 없다면 CPU가 바이트마다 데이터를 나르거나 장치가 바이트마다 인터럽트를 걸어야 하므로, 대용량 전송에서 DMA와 완료 인터럽트의 조합은 CPU 부담을 극적으로 줄인다. 디스크와 네트워크 입출력이 모두 이 구조로 동작한다.
지연 처리: 상반부와 하반부
ISR이 오래 실행되면 그동안 다른 인터럽트 처리와 스케줄링이 지연되므로, 커널은 처리를 둘로 나눈다. 상반부(top half)는 인터럽트 문맥에서 장치 확인과 응답 같은 최소한의 급한 일만 하고, 나머지 무거운 작업은 하반부(bottom half)로 미뤄 나중에 일반적인 커널 문맥에서 처리한다. 리눅스의 softirq, tasklet, 워크큐(workqueue)가 하반부를 구현하는 장치들이다. 이 구조 덕분에 시스템은 인터럽트 폭주 속에서도 응답성을 유지한다. 상반부가 실행되는 인터럽트 문맥에서는 잠들 수 없다는 제약도 중요하다. 잠들려면 대신 실행할 프로세스 문맥이 필요한데 인터럽트는 특정 프로세스에 속하지 않기 때문이다. 그래서 메모리 할당 대기나 뮤텍스 획득처럼 잠들 수 있는 작업은 반드시 하반부로 미뤄야 하며, 이 규칙 위반은 커널 버그의 흔한 원인이다.
타이머 인터럽트와 멀티태스킹
선점형 스케줄링은 타이머 인터럽트 위에서 동작한다. 하드웨어 타이머가 주기적으로 인터럽트를 걸면 커널이 실행 중인 프로세스의 사용 시간을 확인하고, 할당량을 다 썼다면 문맥 교환을 일으켜 다른 프로세스에 CPU를 넘긴다. 인터럽트가 없다면 프로세스가 자발적으로 양보하기 전까지 CPU를 회수할 방법이 없으므로, 타이머 인터럽트는 사실상 선점형 멀티태스킹을 가능하게 하는 토대라고 할 수 있다.
면접에서 이렇게 물어본다
- 폴링과 인터럽트를 비교하고 각각 어떤 상황에서 유리한지 설명해 보라.
- 하드웨어 인터럽트와 예외, 트랩의 차이를 동기와 비동기 관점에서 설명해 보라.
- 인터럽트 발생부터 ISR 실행, 복귀까지의 과정을 순서대로 말해 보라.
- 인터럽트 처리를 상반부와 하반부로 나누는 이유는 무엇인가.
- 타이머 인터럽트가 없다면 선점형 스케줄링이 왜 불가능한지 설명해 보라.
운영체제에서 같이 읽기
- CPU 스케줄링 (CPU Scheduling)운영체제가 준비 상태의 여러 프로세스 중 다음에 CPU를 쓸 프로세스를 고르는 CPU 스케줄링을 다룬다. 선점과 비선점, FCFS부터 라운드 로빈과 MLFQ까지 알고리즘 비교, 리눅스 CFS와 EEVDF까지 정리한다.
- 교착 상태 (Deadlock)둘 이상의 프로세스가 서로가 점유한 자원을 기다리며 영원히 멈추는 교착 상태를 다룬다. 네 가지 필요조건, 예방과 회피와 탐지 회복 전략, 기아와 라이브락의 구분, 데이터베이스 데드락 실무 사례까지 정리한다.
- 파일 시스템 (File System)저장 장치 위에 파일과 디렉터리라는 추상화를 만드는 파일 시스템을 다룬다. 슈퍼블록과 아이노드 구조, 연속과 연결과 색인 할당 비교, 저널링과 쓰기 시 복사, VFS 계층까지 정리한다.
- 프로세스 간 통신 (IPC, Inter Process Communication)독립된 주소 공간을 가진 프로세스들이 데이터를 주고받는 IPC를 다룬다. 메시지 전달과 공유 메모리 모델, 파이프와 메시지 큐와 소켓 등 기법 비교, 파이프 코드 예시와 실무 선택 기준까지 정리한다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기