인터럽트
CPU가 현재 실행 중인 작업을 일시 중단하고 긴급한 이벤트를 먼저 처리한 뒤 원래 작업으로 복귀하는 메커니즘입니다.
인터럽트의 종류
| 구분 | 하드웨어 인터럽트 | 소프트웨어 인터럽트(트랩) |
| 발생 원인 | 외부 장치가 CPU에 신호 전달 | 프로그램이 명시적으로 발생 |
| 동기/비동기 | 비동기적 (언제든 발생) | 동기적 (명령어 실행 중 발생) |
| 예시 | 키보드 입력, 타이머, 디스크 I/O 완료 | 시스템 콜, 디버그 브레이크포인트 |
| 의도성 | 비의도적 (외부 이벤트) | 의도적 |
인터럽트 처리 흐름
① 인터럽트 발생 (하드웨어 신호 or 소프트웨어 명령)
② CPU가 현재 명령어 실행 완료
③ 현재 상태 저장 (PC, 레지스터 → 스택)
④ 인터럽트 벡터 테이블(IDT)에서 핸들러 주소 조회
⑤ 커널 모드로 전환 (모드 비트 1 → 0)
⑥ ISR(Interrupt Service Routine) 실행
⑦ 저장된 상태 복원
⑧ 원래 프로그램으로 복귀 (iret 명령)
사용자 프로그램 실행 중
────────●──────────────────────●──────────
│ 인터럽트 발생 │ 복귀
▼ ▲
┌───────────────────────────────┐
│ ① 상태 저장 │
│ ② IDT에서 핸들러 조회 │
│ ③ ISR 실행 │
│ ④ 상태 복원 │
└───────────────────────────────┘
커널 모드에서 처리
하드웨어 인터럽트의 대표 예시
| 인터럽트 | 발생 장치 | 용도 |
| 타이머 인터럽트 | PIT / APIC 타이머 | 프로세스 스케줄링, 시간 관리 |
| 키보드 인터럽트 | 키보드 컨트롤러 | 키 입력 감지 |
| 디스크 인터럽트 | 디스크 컨트롤러 | I/O 완료 알림 |
| 네트워크 인터럽트 | NIC | 패킷 수신 알림 |
인터럽트 처리 구조 (IDT)
┌─────────────────────────────────────┐
│ IDT (Interrupt Descriptor Table) │
├──────────┬──────────────────────────┤
│ 벡터 번호 │ 핸들러 주소 │
├──────────┼──────────────────────────┤
│ 0 │ Divide Error 핸들러 │
│ 1 │ Debug 핸들러 │
│ 13 │ General Protection Fault │
│ 14 │ Page Fault 핸들러 │
│ 32 │ 타이머 인터럽트 핸들러 │
│ 33 │ 키보드 인터럽트 핸들러 │
│ 0x80 │ 시스템 콜 핸들러 (Linux) │
│ ... │ ... │
└──────────┴──────────────────────────┘
인터럽트 우선순위
여러 인터럽트가 동시에 발생하면 우선순위에 따라 처리 순서가 결정됩니다.
높음 ┌────────────────────────┐
│ 전원 이상 (Power Failure) │
├────────────────────────┤
│ 하드웨어 오류 (Machine Check) │
├────────────────────────┤
│ 타이머 인터럽트 │
├────────────────────────┤
│ 디스크 I/O 인터럽트 │
├────────────────────────┤
│ 네트워크 인터럽트 │
├────────────────────────┤
│ 키보드 인터럽트 │
├────────────────────────┤
낮음 │ 소프트웨어 인터럽트(트랩) │
└────────────────────────┘
폴링 vs 인터럽트
| 항목 | 폴링(Polling) | 인터럽트(Interrupt) |
| 방식 | CPU가 주기적으로 장치 상태 확인 | 장치가 CPU에 이벤트 알림 |
| CPU 사용 | 이벤트 없어도 CPU 낭비 | 이벤트 발생 시에만 CPU 사용 |
| 응답 속도 | 폴링 주기에 의존 | 즉시 감지 가능 |
| 적합한 상황 | 이벤트가 매우 빈번한 경우 | 이벤트 발생이 불규칙한 경우 |
[폴링]
CPU: 데이터 있어? → 없음
CPU: 데이터 있어? → 없음
CPU: 데이터 있어? → 없음
CPU: 데이터 있어? → 있음! → 처리
[인터럽트]
CPU: (다른 작업 수행 중...)
장치: 데이터 왔어! (인터럽트 신호)
CPU: (중단) → 처리 → (복귀)
Java에서 인터럽트가 발생하는 상황
// 1. 키보드 입력 → 키보드 인터럽트 발생
Scanner sc = new Scanner(System.in);
String input = sc.nextLine(); // 키 입력마다 하드웨어 인터럽트
// 2. 파일 I/O → 디스크 인터럽트 발생
FileInputStream fis = new FileInputStream("data.txt");
fis.read(); // 디스크 I/O 완료 시 인터럽트로 CPU에 알림
// 3. 네트워크 통신 → 네트워크 인터럽트 발생
Socket socket = new Socket("example.com", 80);
socket.getInputStream().read(); // 패킷 도착 시 NIC가 인터럽트 발생
// 4. Thread.sleep() → 타이머 인터럽트로 깨어남
Thread.sleep(1000); // 타이머 인터럽트가 1초 후 스레드 깨움