2026년 5월 3일
CS / Theory / OS[OS] 인터럽트
키보드를 누르면 글자가 화면에 나타난다. 마우스를 움직이면 커서가 따라온다. 이 당연한 일들이 가능한 이유는, 컴퓨터가 우리의 행동을 실시간으로 감지하고 반응하기 때문이다.
그 핵심에 인터럽트가 있다. 운영체제가 하드웨어, 프로그램, 예외 상황을 실시간으로 처리하는 방식이다. 이 글에서는 인터럽트가 무엇인지, 어떻게 동작하는지 차근차근 살펴본다.
목차
[1] 인터럽트란
[2] 인터럽트가 없다면
[3] 인터럽트의 처리 흐름
[4] 인터럽트의 종류
[5] ISR — 인터럽트 서비스 루틴
[6] 인터럽트 벡터 테이블
전체 흐름 정리
[1] 인터럽트란
인터럽트(Interrupt)는 CPU에게 "지금 하던 일을 잠깐 멈추고 이걸 먼저 처리해"라고 알리는 신호다.
예를 들어, 키보드 자판을 누르는 순간 키보드 컨트롤러가 CPU에 인터럽트 신호를 보낸다. CPU는 하던 작업을 잠시 중단하고, 어떤 키가 눌렸는지 처리한 뒤 원래 작업으로 돌아온다. 이 과정이 너무 빠르게 일어나기 때문에 사용자는 중단이 있었다는 사실조차 느끼지 못한다.
인터럽트라는 이름 그대로, CPU의 흐름을 중단(interrupt) 시키는 것이다.
[2] 인터럽트가 없다면
인터럽트 없이 CPU가 외부 이벤트를 처리하는 방법은 하나다. 폴링(Polling) — CPU가 주기적으로 장치를 직접 확인하는 방식이다.
컴퓨터 입장에서 표현하면 이런 식이다.
while (true) {
키보드 입력이 있는가?
마우스 이동이 있는가?
네트워크 패킷이 왔는가?
...
}쉽게 말해 CPU가 끊임없이 "뭔가 왔어? 뭔가 왔어?"를 반복하는 것이다. 입력이 없는 동안에도 CPU가 쉬지 못하고 계속 확인해야 하니 자원 낭비가 심하고, 확인 주기에 따라 반응 속도도 일정하지 않다.
인터럽트는 이 문제를 뒤집는다. CPU는 자기 할 일을 하다가, 장치가 신호를 보낼 때만 반응한다. 필요할 때만 개입하는 방식이다.
[3] 인터럽트의 처리 흐름
인터럽트가 발생했을 때 CPU가 처리하는 흐름은 다음과 같다.
1. 인터럽트 발생: 하드웨어 또는 소프트웨어가 CPU에 인터럽트 신호를 보낸다.
2. 현재 상태 저장: CPU는 지금 실행 중이던 작업의 상태(레지스터 값, 프로그램 카운터 등)를 스택에 저장한다. 나중에 원래 작업으로 돌아오기 위해서다.
3. ISR 실행: 인터럽트 종류에 맞는 처리 함수(ISR, Interrupt Service Routine)를 실행한다.
4. 상태 복원: ISR이 끝나면 저장해둔 상태를 불러와 원래 작업을 이어서 실행한다.
[CPU: 작업 실행 중]
↓ 인터럽트 발생
[현재 상태 저장]
↓
[ISR 실행 — 인터럽트 처리]
↓
[상태 복원]
↓
[원래 작업 재개][4] 인터럽트의 종류
인터럽트는 발생 원인에 따라 크게 세 가지로 나뉜다.
하드웨어 인터럽트 (Hardware Interrupt)
외부 장치가 CPU에 보내는 신호다. 가장 일반적인 형태의 인터럽트다.
- 키보드 입력
- 마우스 클릭
- 네트워크 패킷 수신
- 타이머 만료 (OS가 프로세스 스케줄링에 활용한다)
소프트웨어 인터럽트 (Software Interrupt) — 트랩
프로그램이 의도적으로 발생시키는 인터럽트다. 시스템콜이 대표적인 예다.
애플리케이션이 파일을 읽거나 네트워크를 사용하려면 커널의 도움이 필요하다. 이때 소프트웨어 인터럽트를 발생시켜 CPU를 사용자 모드에서 커널 모드로 전환하고, 커널 기능을 호출한다.
예외 (Exception)
CPU가 명령어를 실행하다가 스스로 발생시키는 인터럽트다.
- 0으로 나누기: 산술 예외
- 잘못된 메모리 접근: 세그멘테이션 폴트 (Segmentation Fault)
- 페이지 폴트: 요청한 메모리 페이지가 RAM에 없을 때 발생. OS가 저장장치에서 해당 페이지를 가져온다.
| 종류 | 발생 원인 | 예시 |
|---|---|---|
| 하드웨어 인터럽트 | 외부 장치 | 키보드 입력, 타이머 |
| 소프트웨어 인터럽트 | 프로그램의 의도적 요청 | 시스템콜 |
| 예외 | CPU 실행 중 오류 | 0으로 나누기, 페이지 폴트 |
[5] ISR — 인터럽트 서비스 루틴
ISR(Interrupt Service Routine)은 인터럽트가 발생했을 때 실행되는 처리 함수다. 인터럽트 핸들러(Interrupt Handler)라고도 부른다.
ISR은 두 가지 조건을 만족해야 한다.
- 빠르게 끝나야 한다: ISR이 실행되는 동안 다른 인터럽트 처리가 지연될 수 있다. 처리 시간이 길면 시스템 반응성이 떨어진다.
- 정확해야 한다: ISR이 잘못된 처리를 하면 시스템 전체가 영향을 받을 수 있다.
키보드 인터럽트를 예로 들면, ISR은 어떤 키가 눌렸는지 확인하고 해당 값을 버퍼에 저장하는 짧은 작업만 수행한다. 실제로 그 입력을 화면에 표시하는 것은 ISR이 끝난 뒤 별도의 프로세스가 담당한다.
[6] 인터럽트 벡터 테이블
인터럽트가 발생했을 때 CPU는 어떤 ISR을 실행해야 하는지 어떻게 알까?
그 답이 인터럽트 벡터 테이블(IVT, Interrupt Vector Table) 이다. 인터럽트 번호와 그에 대응하는 ISR의 주소를 담고 있는 일종의 색인표다.
인터럽트 번호 ISR 주소
─────────────────────────
0 0x0040 ← 0으로 나누기 예외 처리
1 0x0080 ← 디버그 예외 처리
...
33 0x00C0 ← 키보드 인터럽트 처리
...CPU는 인터럽트가 발생하면 번호를 확인하고, 테이블에서 해당 ISR 주소를 찾아 바로 실행한다. 덕분에 수십 가지 인터럽트를 빠르게 구분해 처리할 수 있다.
전체 흐름 정리
[장치 / 프로그램 / CPU 예외]
↓ 인터럽트 신호
[CPU: 현재 작업 상태 저장]
↓
[인터럽트 벡터 테이블에서 ISR 주소 조회]
↓
[ISR 실행]
↓
[저장된 상태 복원]
↓
[원래 작업 재개]인터럽트는 OS가 하드웨어, 프로그램, 예외 상황을 실시간으로 처리하는 핵심 메커니즘이다. CPU 스케줄링에서 타이머 인터럽트로 프로세스를 전환하고, 시스템콜에서 소프트웨어 인터럽트로 커널 모드에 진입하는 것 모두 이 구조 위에서 동작한다.
다음 글에서는 OS가 여러 프로그램을 동시에 실행하는 방법인 프로세스와 스레드를 살펴볼 예정이다.
댓글
댓글을 불러오는 중...