Appearance
인터럽트(Interrupt)
정의
인터럽트는 CPU가 현재 실행 흐름을 잠시 멈추고, 더 먼저 처리해야 할 사건을 처리하도록 만드는 메커니즘이다.
현대 운영체제에서는 장치 인터럽트, 예외(exception), 시스템 콜을 모두 "현재 실행 흐름을 커널 쪽 처리 루틴으로 넘기는 진입점"이라는 관점에서 함께 설명하는 경우가 많다.
분류
외부 인터럽트(Hardware Interrupt)
CPU 바깥의 장치가 비동기적으로 보낸 신호로 발생한다.
예: 타이머 인터럽트, 디스크 I/O 완료, 네트워크 패킷 도착, 키보드 입력
예외(Exception)
현재 실행 중인 명령어 때문에 동기적으로 발생한다.
예: page fault, divide-by-zero, invalid opcode, breakpoint
소프트웨어에 의해 의도적으로 발생시키는 예외/트랩
프로그램이 특정 명령어를 실행해서 커널 처리를 요청하는 경우다.
예: 시스템 콜, 디버거용 trap instruction
전통적으로 이를 "소프트웨어 인터럽트"라고 부르기도 하지만, 실제 구현은 아키텍처마다 다르다.
- x86:
syscall,sysenter,int 0x80 - ARM:
svc
- x86:
참고
일부 교재는 내부 인터럽트 전체를 Trap이라고 부르지만, 현대적으로는
fault,trap,abort처럼 더 세분화해 설명하는 편이 정확하다.
인터럽트 처리 과정
- 장치 신호나 예외가 발생한다.
- CPU는 현재 명령 흐름을 중단하고, 최소한의 실행 문맥(PC, 상태 레지스터 등)을 저장한 뒤 커널 모드의 핸들러로 진입한다.
- 인터럽트 벡터 또는 예외 번호를 바탕으로 적절한 핸들러를 실행한다.
- 핸들러는 장치 상태를 확인하고, 필요한 최소 작업을 수행한다.
- 남은 작업은 운영체제가 나중에 처리하도록 미루기도 한다. 예를 들어 Linux는 softirq, workqueue 같은 지연 처리 메커니즘을 사용한다.
- 문맥을 복구한 뒤 원래 작업으로 돌아가거나, 더 적절한 runnable 태스크가 있으면 스케줄러가 다른 태스크를 실행시킬 수 있다.
즉, 인터럽트가 발생했다고 해서 항상 "지금 하던 프로세스가 끝나고 곧바로 다른 프로세스가 실행된다"는 뜻은 아니다. 처리 후 다시 같은 태스크로 복귀할 수도 있다.
폴링(Polling)과 인터럽트 방식
폴링 방식
CPU나 드라이버가 장치의 상태 레지스터를 주기적으로 읽어서 이벤트가 생겼는지 확인하는 방식이다.
구현은 단순하지만, 이벤트가 없어도 계속 확인해야 하므로 CPU 시간을 낭비할 수 있다.
인터럽트 방식
장치가 이벤트가 생긴 순간 CPU에 알리는 방식이다.
현대 시스템에서는 APIC, GIC 같은 인터럽트 컨트롤러가 인터럽트 전달과 우선순위 처리를 담당한다. 임베디드나 고전적인 구조에서는 Daisy Chain, 병렬 우선순위 회로 같은 방식이 쓰이기도 한다.
인터럽트 방식은 하드웨어 지원이 필요하지만, 불필요한 반복 확인 없이 이벤트에 빠르게 반응할 수 있다는 장점이 있다. 그래서 I/O 중심 시스템과 실시간성이 중요한 환경에서 특히 중요하다.