인터럽트 정의와 동작 원리

핵심 요약

  • 인터럽트(Interrupt)는 CPU가 입출력 장치나 예외 상황 발생 시 현재 작업을 잠시 중단하고 즉시 해당 처리를 수행하는 효율적인 기술입니다.
  • 주기적으로 상태를 확인하는 폴링(Polling)과 달리, 이벤트 발생 시에만 신호를 보내 자원 낭비를 막고 즉각적인 대응을 가능하게 합니다.
  • 하드웨어 인터럽트소프트웨어 인터럽트(트랩)로 나뉘며, 시스템 콜이나 예외 처리 등 운영체제의 핵심 기능을 담당합니다.
  • 인터럽트 처리 과정은 문맥 교환(Context Switching)과 상태 저장을 포함한 6단계로 이루어져 있어 작업의 연속성을 보장합니다.

목차

1. 서론: CPU는 어떻게 음악을 들으며 코딩을 할까?

단 하나의 뇌(CPU)를 가진 컴퓨터가 어떻게 노래를 재생하면서 동시에 우리의 코딩 타이핑을 끊김 없이 받아낼 수 있을까요? 얼핏 보면 CPU가 여러 일을 동시에 하는 것처럼 보이지만, 사실 여기에는 아주 찰나의 순간에 작업을 멈추고 전환하는 고도의 기술이 숨어 있습니다. 바로 ‘잠시 멈춤’의 미학, 인터럽트입니다.

인터럽트 정의란 CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외 상황이 발생하여 처리가 필요할 경우, CPU에게 신호를 보내 현재 작업을 일시 중단하고 해당 처리를 수행하도록 하는 기술을 말합니다. 만약 이 기술이 없었다면 우리는 마우스를 움직일 때마다 컴퓨터가 하던 일을 다 끝낼 때까지 기다려야 했을지도 모릅니다.

오늘 이 글에서는 단순한 용어 설명을 넘어, 시스템의 효율성을 극대화하기 위해 탄생한 ‘인터럽트란 무엇인가’에 대한 본질적인 해답을 찾아보려 합니다. 운영체제(OS)와 컴퓨터 구조의 핵심인 이 개념을 이해한다면, 컴퓨터가 외부 세상과 소통하는 원리를 완벽하게 파악할 수 있을 것입니다.

2. 핵심 개념 비교: 폴링(Polling) vs 인터럽트(Interrupt)

왜 굳이 하던 일을 멈추는 복잡한 방식을 쓸까요? 이를 이해하려면 인터럽트의 대조군인 ‘폴링(Polling)’과 비교해보면 명확해집니다. 이 두 가지 방식은 CPU가 외부 장치의 상태를 확인하는 접근법에서 큰 차이가 있습니다.

비유로 이해하기

  • 폴링(Polling): 마치 공부를 하다가 물이 끓는지 확인하기 위해 10초마다 주방으로 달려가 냄비 뚜껑을 열어보는 것과 같습니다. 확인하는 시간 동안 공부(본 작업)는 중단되고, 체력(CPU 자원)은 낭비됩니다.
  • 인터럽트(Interrupt): 주전자에 ‘삐-‘ 소리가 나는 호루라기를 끼워두고 방에서 공부에 집중하는 것입니다. 물이 끓어 소리(신호)가 날 때만 주방으로 가면 되므로, 그전까지는 온전히 공부에 집중할 수 있습니다.

기술적 차이점 분석

폴링 방식은 CPU가 특정 주기마다 I/O 장치의 상태 레지스터를 직접 읽어 변화를 확인합니다. 하지만 입출력 장치는 CPU보다 속도가 훨씬 느리기 때문에, 변화가 없는 대부분의 시간 동안 CPU는 의미 없는 확인 작업만 반복하게 됩니다. 이를 ‘바쁜 대기(Busy Waiting)’라고 하며, 막대한 자원 낭비를 초래합니다.

반면, 인터럽트는 이벤트가 발생했을 때만 하드웨어가 CPU에 신호(Signal)를 보냅니다. CPU는 신호가 오기 전까지 자신의 할 일을 계속할 수 있어 자원 효율성이 극대화됩니다. 이를 ‘비동기적(Asynchronous)’ 처리 방식이라고 합니다.

[표] 폴링 vs 인터럽트 상세 비교

비교 항목 폴링 (Polling) 인터럽트 (Interrupt)
주체 CPU가 직접 확인 장치가 CPU에게 알림
동작 방식 주기적인 상태 체크 (Loop) 이벤트 발생 시 신호 전송 (Event-driven)
CPU 효율성 낮음 (Busy Waiting 발생) 높음 (본래 작업 집중 가능)
구현 난이도 비교적 단순함 하드웨어/소프트웨어 제어 복잡
반응 속도 체크 주기에 따라 지연 발생 가능 즉각적인 반응 가능
현실 예시 10분마다 도착했는지 전화해 묻기 도착하면 전화 달라고 하기

이처럼 컴퓨터공학 인터럽트 개념은 ‘CPU의 시간을 낭비하지 않겠다’는 철학에서 출발합니다.

컴퓨터의 중앙 처리 장치(CPU)가 음악 재생과 코딩을 동시에 처리하는 모습을 나타내는 인포그래픽

3. 인터럽트의 종류 (Types of Interrupts)

인터럽트는 발생 위치와 원인에 따라 크게 두 가지로 나뉩니다. 외부 하드웨어가 보내는 신호와, 내부 프로그램이 유발하는 신호입니다. 컴퓨터공학 인터럽트 개념을 확실히 잡기 위해 이 둘을 명확히 구분해야 합니다.

1) 하드웨어 인터럽트 (External Interrupt)

CPU 외부의 주변 장치들이 “나 좀 봐주세요!”라고 보내는 전기적 신호입니다.

  • 입출력(I/O) 요청: 키보드 입력, 마우스 클릭, 프린터 인쇄 완료 등 사용자와의 상호작용.
  • 디스크 전송 완료: 하드디스크가 데이터 읽기를 마쳤을 때 CPU에 알림.
  • 타이머 인터럽트: 특정 프로그램이 CPU를 독점하지 못하도록, 정해진 시간(Time Slice)이 지나면 운영체제가 강제로 제어권을 뺏어올 때 발생. (멀티태스킹의 핵심)
  • 전원 이상(Power Fail): 정전이나 배터리 부족 시 데이터를 급히 저장하기 위해 발생.

2) 소프트웨어 인터럽트 (Internal Interrupt / Trap)

프로그램 실행 중 CPU 내부에서 발생하는 예외 상황이나, 프로그램이 운영체제에 도움을 요청할 때 발생합니다. ‘트랩(Trap)’이라고도 불립니다.

  • 예외(Exception): 0으로 나누기(Divide by Zero), 할당받지 않은 메모리 영역 침범(Segmentation Fault) 등 오류 발생 시.
  • 시스템 콜(System Call): 사용자 프로그램이 직접 하드웨어를 제어할 수 없으므로, 파일 읽기(read())나 화면 출력(printf()) 같은 기능을 운영체제 커널에 요청할 때 발생. 이때 CPU 모드가 사용자 모드에서 커널 모드로 전환됩니다.

4. 인터럽트 처리 과정 (The Interrupt Cycle)

인터럽트가 발생하면 CPU는 하던 일을 어떻게 멈추고, 다시 돌아올까요? 이 과정은 운영체제(OS)의 프로세스 관리와 직결되는 매우 중요한 부분입니다. 시험이나 면접에서 가장 자주 묻는 6단계 처리 과정을 상세히 알아보겠습니다.

Step 1: 요청 (Request)
인터럽트 발생 요인이 생기면 인터럽트 요청 신호(IRQ, Interrupt Request)가 하드웨어 라인을 타고 CPU에 전달됩니다.

Step 2: 중단 (Suspend)
CPU는 현재 실행 중이던 기계어 명령어(Instruction) 하나가 끝날 때까지만 수행하고, 다음 명령어 실행을 멈춥니다. 무조건 즉시 멈추는 것이 아니라, 하나의 명령어 사이클은 보장합니다.

Step 3: 상태 저장 (Context Saving) – 가장 중요
CPU가 딴짓을 하러 가기 전에, 현재 어디까지 작업했는지 기억해야 합니다. 이때 현재 실행 중이던 주소(PC, Program Counter)와 레지스터 값(SR 등)을 PCB(Process Control Block) 또는 시스템 스택(Stack)에 안전하게 저장합니다. 이것이 제대로 안 되면 나중에 돌아와서 엉뚱한 명령을 실행하게 됩니다.

Step 4: 서비스 실행 (Service)
CPU는 발생한 인터럽트가 어떤 종류인지 식별해야 합니다. 이때 인터럽트 벡터(Interrupt Vector)라는 표를 참조합니다. 이 표에는 각 인터럽트 번호와 짝을 이루는 처리 함수인 ISR(인터럽트 서비스 루틴)의 메모리 주소가 적혀 있습니다. CPU는 이 주소를 찾아가서 실질적인 처리 코드(ISR)를 실행합니다.

Step 5: 복구 (Restore)
ISR 실행이 끝나면, Step 3에서 PCB나 스택에 저장해 두었던 원래의 레지스터 값과 프로그램 카운터(PC) 값을 다시 CPU로 불러옵니다.

Step 6: 재개 (Resume)
CPU는 마치 아무 일도 없었던 것처럼, 중단되었던 지점의 바로 다음 명령어부터 다시 실행을 이어갑니다.

5. 심화 개념: 우선순위와 중첩 (Advanced)

기본 개념을 익혔다면, 이제 조금 더 깊이 있는 질문을 던져볼 차례입니다. “인터럽트 처리 중에 또 다른 인터럽트가 터지면 어떻게 될까요?”

중첩 실행 (Nested Interrupt)과 우선순위
인터럽트 도중 또 다른 인터럽트가 발생하면, CPU는 우선순위(Priority)를 따집니다. 만약 지금 처리 중인 일보다 더 급한 일(예: 하드웨어 고장 경고)이 들어오면, 현재 실행 중인 ISR을 잠시 멈추고 새로운 인터럽트를 먼저 처리합니다. 이를 중첩 실행이라고 합니다. 반대로 중요도가 낮다면 대기 큐에 넣어두고 나중에 처리합니다.

마스킹(Masking)
모든 인터럽트를 다 받아주면 CPU가 일을 못 합니다. 그래서 프로그래머나 OS는 중요하지 않은 인터럽트를 잠시 무시하도록 설정할 수 있는데, 이를 마스킹(Masking) 가능 인터럽트라고 합니다. 하지만 정전이나 하드웨어 오류 같은 Non-maskable Interrupt(NMI)는 절대 무시할 수 없으며 무조건 즉시 처리해야 합니다.

오버헤드(Overhead) 주의
인터럽트는 유용하지만 공짜는 아닙니다. 잦은 인터럽트는 잦은 문맥 교환(Context Switching)을 유발합니다. 상태를 저장하고 복구하는 과정 자체가 CPU 시간을 잡아먹기 때문에, 인터럽트가 지나치게 빈번하면 오히려 시스템 전체 성능이 느려지는 ‘오버헤드’가 발생할 수 있습니다.

6. 결론 및 요약

우리는 지금까지 ‘인터럽트란 무엇인가’에 대해 정의부터 동작 원리까지 깊이 있게 살펴보았습니다. 요약하자면 다음과 같습니다.

  1. 효율성: 인터럽트는 느린 입출력 장치와 빠른 CPU 사이의 속도 차이를 극복하고, CPU가 쉴 새 없이 일할 수 있게 만드는 핵심 기술입니다.
  2. 연결 고리: 외부 하드웨어의 변화를 CPU가 즉각적으로 감지하고 대응하게 해주는 유일한 소통 창구입니다.
  3. 운영체제 근간: 멀티태스킹, 가상 메모리, 시스템 콜 등 현대 운영체제의 복잡한 기능들은 모두 이 인터럽트 메커니즘 위에서 작동합니다.

결국 인터럽트 정의를 한 문장으로 다시 정리하면, “컴퓨터가 외부 세계의 예측 불가능한 이벤트에 가장 효율적으로 대응하기 위한 지능적인 멈춤”이라고 할 수 있습니다. 이 컴퓨터공학 인터럽트 개념을 확실히 이해했다면, 앞으로 배우게 될 프로세스 스케줄링이나 시스템 구조도 훨씬 쉽게 다가올 것입니다.

자주 묻는 질문 (FAQ)

Q1. 인터럽트 벡터(Interrupt Vector)와 벡터 테이블은 무엇인가요?

인터럽트 벡터는 특정 인터럽트가 발생했을 때 실행해야 할 코드(ISR)가 어디에 있는지 알려주는 이정표입니다. 보통 메모리의 0번지 부근에 모여 있으며, [인터럽트 번호 : ISR 시작 주소] 쌍으로 이루어진 목록을 ‘인터럽트 벡터 테이블’이라고 부릅니다.

Q2. 인터럽트가 발생하면 하던 일을 무조건 ‘즉시’ 멈추나요?

아주 엄밀히 말하면 ‘즉시’는 아닙니다. CPU는 현재 수행 중인 기계어 명령어(Instruction) 하나는 온전히 끝낸 뒤에 멈춥니다. 또한, ‘인터럽트 금지(Disable)’ 상태이거나 우선순위가 낮은 인터럽트라면 처리가 보류될 수도 있습니다.

Q3. ISR(인터럽트 서비스 루틴)은 일반 함수와 어떻게 다른가요?

ISR은 일반 함수와 달리 운영체제 커널 영역에서 실행되며, 실행 중에 다른 프로세스로 문맥 교환이 일어나지 않도록 최대한 짧고 간결하게 작성되어야 합니다. 또한 값을 반환(Return)하지 않고, 특정 레지스터를 통해 상태를 복구하며 종료됩니다.

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