하드웨어 인터럽트
CPU 외부의 하드웨어 장치가 비동기적으로 CPU에 신호를 보내 현재 작업을 중단시키고 긴급한 이벤트를 처리하게 하는 메커니즘입니다.
핵심 특징
| 항목 | 내용 |
| 발생 주체 | CPU 외부 하드웨어 장치 (키보드, 디스크, NIC 등) |
| 동기/비동기 | 비동기적 — 현재 실행 중인 프로그램과 무관하게 발생 |
| 전달 경로 | 장치 → 인터럽트 컨트롤러(PIC/APIC) → CPU |
| 의도성 | 비의도적 — 프로그램이 요청한 것이 아님 |
| 처리 주체 | ISR (Interrupt Service Routine) |
하드웨어 인터럽트 처리 흐름
① 하드웨어 장치에서 이벤트 발생 (예: 키보드 키 입력)
② 장치가 인터럽트 컨트롤러(PIC/APIC)에 IRQ 신호 전달
③ 인터럽트 컨트롤러가 우선순위 판단 후 CPU의 INTR 핀에 신호
④ CPU가 현재 명령어 실행 완료
⑤ CPU가 인터럽트 플래그(IF) 확인 — 비활성이면 무시
⑥ 현재 상태 저장 (PC, 레지스터, 플래그 → 스택)
⑦ IDT에서 IRQ 번호에 해당하는 ISR 주소 조회
⑧ 커널 모드로 전환 후 ISR 실행
⑨ ISR 완료 후 인터럽트 컨트롤러에 EOI(End of Interrupt) 전송
⑩ 상태 복원 후 원래 프로그램으로 복귀 (iret)
** IDT
하드웨어 장치 인터럽트 컨트롤러 CPU
┌─────────┐ ┌──────────────┐ ┌──────────┐
│ 키보드 │──IRQ1──→│ │ │ │
│ 디스크 │──IRQ14─→│ PIC / APIC │─INTR─→│ CPU │
│ NIC │──IRQ11─→│ (우선순위 │ │ (IDT │
│ 타이머 │──IRQ0──→│ 판단) │ │ 조회) │
└─────────┘ └──────────────┘ └──────────┘
IRQ (Interrupt Request) 번호
전통적인 x86 PIC 기준의 IRQ 할당입니다.
| IRQ | 장치 | 설명 |
| 0 | 타이머 (PIT) | 프로세스 스케줄링, 시간 관리 |
| 1 | 키보드 | 키 입력 감지 |
| 2 | 캐스케이드 | 슬레이브 PIC 연결용 |
| 6 | 플로피 디스크 | 플로피 I/O (레거시) |
| 8 | RTC | 실시간 시계 |
| 11 | NIC | 네트워크 패킷 수신 |
| 12 | PS/2 마우스 | 마우스 입력 |
| 14 | Primary IDE | 하드디스크 I/O |
| 15 | Secondary IDE | 보조 하드디스크 I/O |
| 항목 | PIC (8259A) | APIC |
| 지원 IRQ 수 | 15개 (마스터 8 + 슬레이브 8) | 수백 개 이상 |
| 멀티코어 지원 | 불가 | 가능 (각 코어에 Local APIC) |
| 우선순위 관리 | 고정 우선순위 | 프로그래밍 가능 |
| 사용 환경 | 레거시 시스템 | 현대 멀티코어 시스템 |
[PIC 구조] [APIC 구조]
장치 → 슬레이브 PIC 장치 → I/O APIC
↓ ↓
마스터 PIC → CPU Local APIC (코어0)
Local APIC (코어1)
Local APIC (코어2)
Local APIC (코어3)
마스커블 vs 논마스커블 인터럽트
| 항목 | 마스커블(Maskable) | 논마스커블(NMI) |
| 비활성화 가능 | 가능 (cli 명령) | 불가능 |
| 용도 | 일반 I/O 장치 | 치명적 오류 |
| 예시 | 키보드, 디스크, NIC | 메모리 패리티 오류, 전원 이상 |
| CPU 핀 | INTR | NMI |
인터럽트 처리 중 또 다른 인터럽트가 오면?
| 방식 | 설명 |
| 인터럽트 비활성화 | ISR 실행 중 같은 레벨 인터럽트를 막음 (IF 플래그 클리어) |
| 중첩 인터럽트 | 더 높은 우선순위의 인터럽트는 현재 ISR을 선점 가능 |
ISR(IRQ1 - 키보드) 실행 중
│
├── IRQ14(디스크, 높은 우선순위) 발생 → ISR 선점, 디스크 먼저 처리
│
└── IRQ12(마우스, 낮은 우선순위) 발생 → 대기, 키보드 ISR 완료 후 처리
Java에서 하드웨어 인터럽트가 발생하는 상황
// Java 코드 자체가 하드웨어 인터럽트를 발생시키는 것은 아니지만,
// 아래 작업들은 하드웨어 이벤트를 통해 완료 통보를 받음
// 1. 키보드 입력 → IRQ1 (키보드 인터럽트)
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
// 2. 파일 읽기 → IRQ14 (디스크 인터럽트)
// DMA가 데이터 전송 완료 후 인터럽트로 CPU에 알림
byte[] data = Files.readAllBytes(Path.of("large_file.dat"));
// 3. 네트워크 수신 → IRQ11 (NIC 인터럽트)
ServerSocket server = new ServerSocket(8080);
Socket client = server.accept(); // 패킷 도착 시 NIC가 인터럽트 발생
// 4. Thread.sleep() → IRQ0 (타이머 인터럽트)
Thread.sleep(1000); // 타이머 인터럽트로 시간 경과 감지