인터럽트 종류 심화 – 하드웨어와 소프트웨어

핵심 요약

  • 인터럽트는 CPU가 폴링 방식의 비효율성을 극복하고 특정 이벤트 발생 시에만 작업을 처리하도록 하는 메커니즘입니다.
  • 하드웨어 인터럽트는 외부 장치의 전기적 신호로 발생하는 비동기적 이벤트이며, 소프트웨어 인터럽트는 명령어 실행 결과로 발생하는 동기적 이벤트입니다.
  • 하드웨어 인터럽트는 Maskable(가능)Non-Maskable(불가능)로, 소프트웨어 인터럽트는 예외(Exception)시스템 콜(System Call)로 세분화됩니다.
  • 운영체제는 ISR, 컨텍스트 스위칭, 우선순위 등의 메커니즘을 통해 인터럽트를 안전하고 효율적으로 처리합니다.

목차

현대 운영체제에서 멀티태스킹과 효율적인 자원 관리를 이해하기 위해서는 다양한 인터럽트 종류와 그 발생 원리를 파악하는 것이 필수적입니다.

우리가 컴퓨터를 사용할 때, CPU는 쉴 새 없이 수많은 작업을 처리합니다. 과거의 초기 시스템이나 단순한 구조에서는 CPU가 입출력 장치의 상태를 끊임없이 확인하는 ‘폴링(Polling)’ 방식을 사용했습니다. 마치 배달 음식이 왔는지 확인하기 위해 1초마다 현관문을 열어보는 것과 같죠. 이는 매우 비효율적입니다.

이 문제를 해결하기 위해 등장한 것이 바로 ‘인터럽트(Interrupt)’입니다. 배달원이 도착하면 초인종을 눌러 알려주는 것처럼, 특정 이벤트가 발생했을 때만 CPU에게 신호를 보내는 방식입니다. 하지만 단순히 신호를 보내는 것을 넘어, 누가(Who) 신호를 보냈고, 왜(Why) 보냈느냐에 따라 처리 방식은 완전히 달라집니다.

오늘 글에서는 단순한 사전적 정의를 넘어, 하드웨어와 소프트웨어 관점에서 인터럽트를 명확히 분류하고, 각 메커니즘이 실제 운영체제(OS) 내부에서 어떻게 다르게 동작하는지 심층 분석해 보겠습니다.

1. 인터럽트의 개념과 분류 체계

인터럽트 분류를 논하기 전에, 정확한 정의를 짚고 넘어가야 합니다. 인터럽트란 CPU가 프로그램을 실행하고 있을 때, 예외 상황이나 주변 장치의 급한 요청이 발생하면 현재 실행 중인 작업을 잠시 중단(Suspend)하고, 미리 정해진 코드를 우선적으로 처리하도록 하는 강제 신호입니다.

이 시스템 덕분에 CPU는 불필요한 대기 시간 없이 본래 작업에 집중하다가, 키보드 입력이나 네트워크 패킷 수신 같은 이벤트가 발생했을 때만 즉각적으로 반응할 수 있습니다.

컴퓨터 시스템에서 인터럽트를 분류하는 디지털 인포그래픽, 중앙에 CPU와 하드웨어 및 소프트웨어 인터럽트 연결된 모습

인터럽트는 크게 발생 ‘위치’와 ‘원인’을 기준으로 두 가지로 분류됩니다.

  • 외부 인터럽트 (External Interrupt): CPU의 바깥쪽, 즉 키보드, 마우스, 하드디스크 같은 주변 장치에서 전기적 신호를 통해 들어오는 요청입니다. 흔히 ‘하드웨어 인터럽트’라고 부릅니다.
  • 내부 인터럽트 (Internal Interrupt): CPU 내부에서 실행되는 명령어의 결과나 오류로 인해 발생하는 요청입니다. 프로그램 실행 중에 발생하므로 ‘소프트웨어 인터럽트’ 또는 ‘트랩(Trap)’이라고 부릅니다.

이 두 가지는 CPU를 멈추게 한다는 결과는 같지만, 그 시작점과 처리 목적이 완전히 다릅니다. 이를 명확히 구분하는 것이 시스템 엔지니어링의 첫걸음입니다.

[핵심 요약]

  • 외부(Hardware): “장치가 보낸 전기 신호” (비동기적)
  • 내부(Software): “명령어 실행 중 발생한 예외” (동기적)

2. 하드웨어 인터럽트 (External Interrupt) 상세 분석

하드웨어 인터럽트는 CPU 외부의 디스크 컨트롤러나 I/O 장치 등에서 생성되어, CPU의 IRQ(Interrupt Request) 라인을 통해 전달되는 전기적 신호입니다. 이 신호는 프로그램의 실행 흐름과 상관없이 언제든 불시에 도착할 수 있다는 점에서 ‘비동기적(Asynchronous)’ 이벤트입니다.

하드웨어 인터럽트는 시스템의 중요도에 따라 두 가지로 세분화됩니다.

1) Maskable Interrupt (가능 인터럽트)

말 그대로 ‘가면(Mask)을 씌워 무시할 수 있는’ 인터럽트입니다. CPU에는 Interrupt Flag(IF)라는 비트가 있는데, 만약 CPU가 지금 아주 중요한 작업을 처리 중이라면 이 플래그를 조절해 잠시 요청을 보류할 수 있습니다.

  • 특징: 당장 처리하지 않아도 시스템이 멈추지 않습니다.
  • 예시: 키보드 입력, 마우스 이동, 프린터 인쇄 완료 신호 등 일반적인 입출력 요청이 여기에 해당합니다.

2) Non-Maskable Interrupt (NMI, 불가능 인터럽트)

어떤 상황에서도 절대 무시할 수 없는 치명적인 신호입니다. 이 신호가 들어오면 CPU는 하던 일을 무조건 멈추고 즉시 처리해야 합니다.

  • 특징: 시스템의 생존과 직결된 문제입니다.
  • 예시: 정전으로 인한 전원 결함(Power failure), RAM의 데이터 손상을 알리는 패리티 에러(Parity Error), 하드웨어 자체의 물리적 고장 등이 있습니다.
하드웨어 인터럽트 종류(가능 인터럽트, 불가능 인터럽트)를 표현한 현대적인 디지털 타임라인 인포그래픽

주요 활용 예시

  • 타이머 인터럽트: 현대의 시분할 시스템(Time-sharing) 운영체제에서 가장 중요합니다. 특정 프로그램이 CPU를 독점하지 못하도록 일정 시간마다 인터럽트를 발생시켜, 운영체제가 다른 프로세스로 작업을 전환(스케줄링)할 수 있게 합니다.
  • I/O 인터럽트: 사용자가 키보드를 누르는 순간, 네트워크 랜카드가 데이터를 수신한 순간 CPU에 신호를 보내 데이터를 처리하게 합니다.

3. 소프트웨어 인터럽트 (Internal Interrupt) 상세 분석

소프트웨어 인터럽트는 프로그램이 실행되는 도중(Run-time), 특정 명령어에 의해 ‘동기적’으로 발생하는 이벤트입니다. 하드웨어 라인을 타는 것이 아니라, 코드 실행의 결과로 발생하기 때문에 예측이 가능합니다. 흔히 ‘트랩(Trap)’이라고도 불립니다.

소프트웨어 인터럽트는 크게 예외(Exception)와 시스템 콜(System Call)로 나뉩니다.

1) 예외 (Exception)

프로그램 실행 중 오류나 특이 사항이 발생했을 때 CPU가 이를 감지하는 메커니즘입니다. 발생 원인과 복구 가능 여부에 따라 세 가지로 나뉩니다.

종류 설명 및 복구 가능성 대표 예시
Fault (폴트) 오류가 발생했지만, 문제 해결 후 해당 명령어부터 다시 실행할 수 있습니다. Page Fault: 가상 메모리에 없는 데이터를 찾을 때 발생하며, OS가 데이터를 로드한 후 다시 실행합니다.
Trap (트랩) 디버깅 등을 위해 의도적으로 발생시키며, 처리 후 다음 명령어로 넘어갑니다. Breakpoint: 개발자가 코드의 특정 지점에서 멈추도록 설정할 때 사용합니다.
Abort (중단) 하드웨어나 소프트웨어의 심각한 오류로 복구가 불가능한 경우입니다. Machine Check: 프로세스를 강제로 종료해야 할 만큼 심각한 기계어 오류 등이 해당됩니다.
소프트웨어 인터럽트의 예외와 시스템 콜 분류를 나타내는 현대적인 디지털 인포그래픽

2) 시스템 콜 (System Call)

사용자 프로그램(User Mode)이 운영체제 커널(Kernel Mode)의 기능을 빌려 쓰기 위해 요청하는 인터럽트입니다. 우리가 C언어에서 printf를 쓰거나 파일을 열 때(open), 프로그램은 직접 하드웨어를 건드리지 못합니다. 이때 int 0x80 혹은 syscall 같은 명령어를 통해 소프트웨어 인터럽트를 발생시켜, “OS님, 파일 좀 읽어주세요”라고 요청하게 됩니다.

[전문가 노트]

소프트웨어 인터럽트는 단순히 오류를 잡는 것을 넘어, 응용 프로그램이 운영체제의 거대한 서비스(파일 시스템, 네트워크 등)에 접근하는 유일한 관문(Gateway) 역할을 수행합니다.

4. 하드웨어 vs 소프트웨어 인터럽트 비교 분석

두 **인터럽트 종류**는 발생 원리와 처리 시점에서 결정적인 차이를 보입니다. 아래 표를 통해 그 차이를 명확히 구분해 보겠습니다.

비교 항목 하드웨어 인터럽트 (External) 소프트웨어 인터럽트 (Internal)
발생 주체 외부 하드웨어 장치 (키보드, 타이머, 디스크 등) CPU 내부 명령어 (프로그램 실행 중 발생)
발생 시점 비동기적 (Asynchronous)
프로그램 실행과 무관하게 언제든 발생
동기적 (Synchronous)
특정 명령어가 실행될 때 정확히 발생
PC 처리 시점 현재 명령어 실행을 마치고, 다음 명령어 실행 전에 처리 현재 명령어를 실행하는 도중 혹은 직후에 처리
주요 목적 하드웨어 제어, I/O 처리, 멀티태스킹 타이밍 예외(오류) 처리, 시스템 콜(OS 서비스 요청), 디버깅
신호 전달 IRQ 라인(전기 신호)을 통해 전달 소프트웨어 명령어 로직에 의해 발생

핵심 차이:
하드웨어 인터럽트는 “나 지금 도착했어! 문 열어줘!”라고 밖에서 외치는 손님(비동기)이라면, 소프트웨어 인터럽트는 집 안에서 요리를 하다가 “앗, 소금이 없네?” 하고 깨닫는 상황(동기)과 같습니다. 하드웨어는 반응성(Responsiveness)을, 소프트웨어는 프로그램의 흐름 제어(Control Flow)를 담당합니다.

하드웨어 인터럽트와 소프트웨어 인터럽트의 차이를 비교하는 디지털 인포그래픽

5. 심화: 인터럽트 처리 메커니즘 (ISR & Priority)

인터럽트가 발생했을 때 운영체제는 어떻게 반응할까요? 단순히 멈추는 것이 아니라 정교한 처리 루틴을 따릅니다.

1. 인터럽트 서비스 루틴 (ISR) 진입

인터럽트가 감지되면 CPU는 하던 일을 멈추고 ‘인터럽트 벡터 테이블(IVT)’을 참조합니다. 이 테이블에는 각 인터럽트 번호에 해당하는 처리 코드, 즉 ISR(Interrupt Service Routine)의 메모리 주소가 적혀 있습니다. CPU는 이 주소로 점프하여 해당 인터럽트를 처리하는 코드를 실행합니다.

2. 컨텍스트 스위칭 (Context Switching)

ISR로 넘어가기 전, 가장 중요한 과정이 있습니다. 바로 현재 상태를 저장하는 것입니다. CPU는 현재 실행 중이던 프로그램의 레지스터 값, 프로그램 카운터(PC) 등을 PCB(Process Control Block)나 스택에 안전하게 저장합니다. 이를 컨텍스트 스위칭이라고 하며, 인터럽트 처리가 끝난 후 다시 원래 작업으로 매끄럽게 복귀하기 위해 필수적입니다. 이 과정은 시스템 오버헤드를 발생시키므로, OS는 이를 최대한 효율적으로 처리하도록 설계됩니다.

인터럽트 처리 메커니즘을 설명하는 현대적인 디지털 인포그래픽, ISR, 컨텍스트 스위칭, 우선순위 및 중첩 처리 포함

3. 우선순위 (Priority)와 중첩 처리

만약 키보드를 치는 도중에 전원 공급에 문제가 생기면(NMI) 어떻게 될까요? 이때는 우선순위(Priority)가 작동합니다.

  • 중첩 인터럽트: 인터럽트 처리 중에 또 다른 인터럽트가 발생하면, 더 높은 우선순위를 가진 작업을 먼저 처리합니다.
  • 일반적으로 전원 이상(NMI) > 타이머 > 키보드 입력 순으로 우선순위가 하드웨어적으로 결정되어 있습니다.

4. 2026년 최신 기술 트렌드: Processor Affinity

최근의 멀티코어 프로세서 환경(2026년 기준)에서는 인터럽트 처리를 특정 코어에 전담시키거나 분산시키는 Processor Affinity(프로세서 친화성) 기술이 중요해졌습니다. 모든 코어가 인터럽트에 반응하면 캐시 메모리 효율이 떨어지기 때문에, 네트워크 패킷 처리는 1번 코어, 디스크 I/O는 2번 코어에 할당하는 식으로 성능을 최적화합니다.

6. 결론 및 요약

인터럽트 종류를 명확히 구분하는 것은 단순한 이론 학습을 넘어, 시스템 엔지니어와 개발자에게 있어 디버깅과 시스템 설계의 기초 체력을 다지는 과정입니다.

  • 하드웨어 인터럽트는 외부 세상과 소통하며 시스템의 민첩한 반응성을 책임집니다.
  • 소프트웨어 인터럽트는 프로그램의 오류를 막고 운영체제의 기능을 안전하게 사용할 수 있게 하는 안정성과 확장성을 담당합니다.

면접이나 실무 회의에서 “인터럽트 발생 시 OS는 어떻게 대처합니까?”라는 질문을 받는다면, 단순히 “멈추고 처리합니다”라고 답하기보다, “발생 원인에 따라 하드웨어와 소프트웨어 인터럽트로 나뉘며, IVT를 통해 ISR을 호출하고 우선순위에 따라 컨텍스트 스위칭을 수행합니다”라고 논리적으로 설명해 보세요. 여러분의 기술적 깊이가 확실히 증명될 것입니다.

자주 묻는 질문 (FAQ)

Q: 폴링(Polling)과 인터럽트의 가장 큰 차이점은 무엇인가요?

A: 폴링은 CPU가 주기적으로 장치 상태를 확인하는 방식으로 리소스 낭비가 심한 반면, 인터럽트는 이벤트가 발생했을 때만 CPU에 알리는 방식으로 훨씬 효율적입니다. 현대 OS는 대부분 인터럽트 방식을 사용합니다.

Q: NMI(Non-Maskable Interrupt)는 주로 언제 발생하나요?

A: 정전, 하드웨어 고장, 메모리 패리티 에러 등 시스템에 치명적인 영향을 줄 수 있는 긴급 상황에서 발생하며, CPU는 이를 무시할 수 없습니다.

Q: 컨텍스트 스위칭이 왜 필요한가요?

A: 인터럽트 처리 후 원래 작업하던 지점으로 정확히 돌아가기 위해 필요합니다. 현재 레지스터 값과 프로그램 카운터(PC) 등을 저장해 두지 않으면 작업을 복구할 수 없습니다.

Q: C언어에서 시그널 핸들러(Signal Handler)는 소프트웨어 인터럽트인가요?

A: 네, 맞습니다. 운영체제 레벨의 소프트웨어 인터럽트 메커니즘을 응용 프로그램에서 제어할 수 있게 추상화한 것입니다. 아래는 간단한 예시 코드입니다.


#include <stdio.h>
#include <signal.h>

// 시그널 처리 함수 (ISR과 유사한 역할)
void handle_sigint(int sig) {
    printf("인터럽트 신호(SIGINT)를 감지했습니다: %d\n", sig);
}

int main() {
    signal(SIGINT, handle_sigint);
    while (1); // 무한 루프 상태에서 Ctrl+C 입력 시 핸들러 작동
    return 0;
}

이 글은 어떠셨나요? 자유롭게 의견을 남겨주세요! 💬