인터럽트

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초 후 스레드 깨움

CSLOG에서 보기