1.시스템&인프라/개발 입문자를 위한 운영체제

19편. 인터럽트란 무엇인가? – 컴퓨터가 실시간 반응하는 비밀

쿼드큐브 2025. 11. 23. 14:38
반응형
반응형

19편. 인터럽트란 무엇인가? – 컴퓨터가 실시간 반응하는 비밀

 

📚 목차
1. 인터럽트란? - CPU를 깨우는 스마트 알림
2. 하드웨어 vs 소프트웨어 인터럽트 - 신호의 출처는 어디인가?
3. 운영체제는 인터럽트에 어떻게 반응하는가?
4. 우선순위와 IRQ - 인터럽트는 어떻게 처리될까?
✔ 마무리 - 개발 실무 관점에서 본 인터럽트의 중요성

 

운영체제를 공부하다 보면 자주 마주치는 용어 중 하나가 바로 인터럽트(Interrupt)입니다.

생소한 이름과 복잡해 보이는 구조 때문에 처음에는 어렵게 느껴지지만, 사실 인터럽트는 컴퓨터 시스템이 외부 환경과 실시간으로 소통할 수 있게 해주는 핵심 기술입니다.

 

이 글에서는 인터럽트의 개념부터 하드웨어와 소프트웨어 인터럽트의 차이, 그리고 인터럽트가 발생했을 때 운영체제가 어떻게 반응하는지까지 실제 예시와 함께 알기 쉽게 설명해 보겠습니다.

 

1. 인터럽트란? – CPU를 깨우는 스마트 알림

운영체제를 공부하다 보면 자주 마주치는 핵심 개념이 바로 인터럽트(Interrupt)입니다. 처음엔 어렵게 느껴지지만, 사실 인터럽트는 컴퓨터가 외부와 실시간으로 소통할 수 있도록 도와주는 스마트한 알림 시스템입니다.

 

🟦 인터럽트란?

인터럽트(Interrupt)란 말 그대로 "방해하다", "중단하다"라는 뜻입니다.

컴퓨터에서의 인터럽트는 CPU가 어떤 작업을 수행하던 중, 외부나 내부의 이벤트가 발생했음을 알려주기 위해 보내는 신호입니다.

 

이 신호를 받은 CPU는 현재 하고 있던 작업을 잠시 멈추고, 이벤트 처리(예: 입력 처리, 오류 처리 등)에 집중한 뒤 다시 원래 작업으로 돌아옵니다.

인터럽트 기본 개념
인터럽트 기본 개념


예를 들어 사용자가 키보드를 눌렀을 때, 그 신호는 하드웨어 인터럽트로 CPU에 전달되고, CPU는 이 신호를 처리하기 위해 입력 처리 루틴을 실행합니다. 이처럼 인터럽트는 시스템이 실시간으로 반응하는 데 반드시 필요한 장치입니다.

 

🟦 폴링(Polling) 방식과의 차이

인터럽트를 이해할 때 폴링(polling)이라는 방식과 비교하면 개념이 더 쉽게 잡힙니다.

🔸폴링: CPU가 특정 장치를 계속 확인하며 변화가 있는지 감시 → 계속 초인종을 들여다보는 것

🔸인터럽트 : 사건이 발생하면 장치가 CPU에게 알려줌 초인종이 울리면 CPU가 반응

 

폴링 방식에서는 CPU가 "입력 장치에 이벤트가 발생했는지"를 계속해서 확인해야 하므로, 매우 비효율적이고 자원을 낭비합니다.

반면 인터럽트 방식은 사건이 발생했을 때만 CPU를 깨우기 때문에 자원 낭비를 줄이고 시스템 반응성을 높일 수 있습니다.

 

✔️ 비유로 이해하기

🔸비유 1 – 택배가 오길 기다리는 방법

▸ 폴링 방식: 매 1분마다 현관문을 열어 “택배 왔나?”를 확인하는 것
▸ 인터럽트 방식: 택배가 오면 벨을 누르고 알려주는 것 → 그때 나가면 됨

 

🔸비유 2 – 전화와 문자 메시지

폴링: 전화를 걸어 계속 “지금 괜찮아?”라고 묻는 것
인터럽트: 문자가 오면 “지금 돼요”라고 알려줌 → 불필요한 반복 없음

 

이처럼 인터럽트는 불필요한 반복을 줄이고, 시스템 자원을 효율적으로 사용하는 스마트한 알림 방식이라고 볼 수 있습니다.

 

🟦 왜 인터럽트가 중요한가?

현대의 컴퓨터 시스템은 키보드, 마우스, 디스크, 네트워크, USB 등 수많은 입출력 장치와 동시에 동작합니다. 이 모든 장치들이 폴링 방식으로 작동한다면, CPU는 하루 종일 장치 상태만 들여다보느라 정작 중요한 계산 작업은 수행하지 못할 것입니다.

 

인터럽트는 CPU가 “필요할 때만” 반응하도록 만들어 줍니다.

즉, 인터럽트 덕분에 컴퓨터는 사용자 입력, 장치의 데이터 수신, 오류 발생 등 다양한 사건에 즉시 반응하면서도 불필요한 리소스 낭비를 줄이는 구조를 갖출 수 있습니다.

 

2. 하드웨어 vs 소프트웨어 인터럽트 – 신호의 출처는 어디인가?

운영체제에서 인터럽트(Interrupt)는 외부나 내부의 중요한 사건을 CPU에 즉시 알려주는 신호입니다. 그렇다면 이 인터럽트는 누가 언제 발생시키는 걸까요?

크게 보면 두 종류가 있습니다. 하드웨어 인터럽트와 소프트웨어 인터럽트입니다.

 

🟦 하드웨어 인터럽트 – 장치가 먼저 신호를 보낸다

하드웨어 인터럽트는 CPU 외부의 장치가 발생시킵니다. 즉, 입출력 장치나 하드웨어 부품이 스스로 신호를 보내 CPU의 주의를 끌어야 할 때 사용됩니다.

 

✔️ 예시를 보겠습니다.

🔸 키보드를 누르면 키보드 컨트롤러가 인터럽트를 발생시켜 CPU에 "입력이 들어왔어요!"라고 알립니다.

🔸 마우스를 움직이면 마우스 장치가 인터럽트를 보내 좌표나 클릭 정보를 전달하라고 요청합니다.

🔸 네트워크 카드가 패킷을 받으면 CPU에 "새 데이터가 도착했어요!"라는 인터럽트를 발생시켜 즉시 처리하게 합니다.

🔸 타이머가 주기적으로 인터럽트를 발생시켜 CPU 스케줄링을 가능하게 만듭니다.

즉, 하드웨어 인터럽트는 CPU가 외부 세계와 소통하는 창구입니다.

 

🟦 소프트웨어 인터럽트 – 프로그램이 직접 요청한다

반대로, 소프트웨어 인터럽트는 실행 중인 프로그램이 의도적으로 CPU에 인터럽트를 발생시키는 것입니다. 이것은 보통 운영체제에게 특별한 처리를 요청할 때 사용됩니다.

 

✔️ 대표적인 예는 바로 시스템 콜(System Call)입니다.

예를 들어, 프로그램에서 다음과 같은 코드를 실행한다고 가정해 보겠습니다:

read(fd, buffer, size);

이 함수는 단순한 함수 호출처럼 보이지만, 사실은 커널 모드에 있는 운영체제에게 "파일에서 데이터를 읽어 주세요"라는 요청을 보내는 것입니다.

 

이 요청은 내부적으로 소프트웨어 인터럽트를 발생시켜 커널에게 전달됩니다.

 

실제로 사용되는 명령어 예시

▸ x86 리눅스 32비트: int 0x80
→ 0x80번 벡터를 통해 인터럽트를 발생시킵니다.

▸ x86_64 리눅스 64비트: syscall 명령

→ 성능 개선을 위해 특별한 명령어로 처리됩니다.

이처럼, 소프트웨어 인터럽트는 사용자 프로그램이 운영체제 기능을 사용할 수 있도록 다리를 놓는 역할을 합니다.

 

🟦 예외(Exception)도 인터럽트의 일종

또한, 프로그램 실행 중 예기치 못한 문제가 발생했을 때도 소프트웨어 인터럽트가 발생합니다.

이를 예외(예: 0으로 나누기, 페이지 폴트)라고 부르며, CPU는 이를 감지하고 즉시 커널에 처리 요청을 합니다.

 

예: 어떤 프로그램이 존재하지 않는 메모리에 접근하면 → 페이지 폴트 예외 발생 → OS가 해당 페이지를 메모리에 로드

✔️ 예제 1: 0으로 나누기 → Divide-by-zero Exception

#include <stdio.h>

int main() {
    int a = 10;
    int b = 0;
    int c = a / b;  // 💥 여기서 예외 발생
    printf("결과: %d\n", c);
    return 0;
}

▸ 실행 중 a / b 연산에서 0으로 나누기 예외(Divide-by-zero Fault)가 발생합니다

▸ CPU는 이 상황을 감지하고 #DE (Divide Error) 예외를 발생시킵니다.

▸ OS는 인터럽트 벡터 테이블을 통해 적절한 예외 처리 코드를 호출합니다.
▸ 결과적으로, 프로그램은 Floating point exception 에러를 내고 종료됩니다. (일반적으로 정수 0 나누기 오류는 부동 소수점 예외로 처리됩니다. Segmentation fault는 주로 유효하지 않은 메모리 접근 시 발생합니다.)

 

✔️ 언어 수준 예외와는 다릅니다.

Java나 Python에서 발생하는 예외(Exception)는 우리가 지금까지 설명한 운영체제 수준의 예외(Exception)와는 의미와 작동 방식이 다릅니다. 하지만 용어가 같기 때문에 혼동하기 쉽습니다.

 

🔸 운영체제 수준 예외는 CPU가 감지하고 OS가 직접 처리합니다.

→ 하드웨어 관점의 치명적인 문제로 간주

 

🔸 Java/Python 예외는 언어 내부에서 정의된 오류 상황으로,
→ 개발자가 try-catch 또는 try-except 구문으로 예외를 잡아 처리할 수 있습니다.

구분 Exception(Java/Pyhon) Interrupt / Fault(CPU/OS)
의미 예외 상황에 대한 언어 레벨의 구조화된 처리 시스템 레벨의 비정상 상황 발생 신호
예시 IndexOutOfBoundsException, KeyError, IOError Divide-by-zero, Page Fault, Invalid Opcode
처리 프로그래머가 try-catch로 잡을 수 있음 운영체제가 핸들러를 호출해 처리

 

3. 운영체제는 인터럽트에 어떻게 반응하는가?

운영체제에서 인터럽트는 “지금 이 사건을 바로 처리해 주세요!” 라는 장치나 프로그램의 요청 신호입니다.

이 요청이 발생하면 CPU는 현재 작업을 잠시 멈추고, 인터럽트를 처리한 뒤 다시 원래 작업으로 돌아갑니다.

이를 통해 시스템은 사용자의 입력이나 외부 장치의 신호에 즉각 반응할 수 있게 됩니다.

 

🟦 인터럽트 처리 전체 흐름

아래는 인터럽트가 발생했을 때 운영체제가 어떤 순서로 반응하는지 단계별로 설명한 내용입니다.

 

✔️ 1. 인터럽트 발생

▸ 하드웨어 장치(예: 키보드, 마우스, 네트워크 카드 등)나 소프트웨어(예: 시스템 콜, 예외 처리 등)가 인터럽트를 발생시키며, CPU는 이를 특정 번호(IRQ, Interrupt Request Number)로 식별합니다.

▸ 이 요청은 마치 "지금 바로 이 일을 처리해 주세요!" 라는 벨 소리와 같습니다.

✔️ 2. CPU 상태 저장(컨텍스트 저장)

▸ CPU는 현재 실행 중인 작업(예: 사용자가 작성 중인 문서)을 잠시 멈추고, 현재 상태(Context)를 저장합니다.

▸ 여기서 상태란 레지스터 값, 프로그램 카운터, 스택 포인터 등입니다.

▸ 이 작업은 컨텍스트 스위칭(Context Switching)의 일부이며, 인터럽트 처리의 경우 전체 문맥 전환은 필요 없고, 최소한의 상태만 저장하는 경우도 많습니다.

 

✔️ 3. 인터럽트 핸들러 실행 (Interrupt Service Routine)

▸ OS는 장치 종류에 따라 해당 인터럽트를 처리할 수 있는 인터럽트 핸들러(ISR)를 호출합니다.

▸ 예: 키보드 인터럽트 → 입력 버퍼에 키 값을 저장하는 코드 실행

▸ 이 코드는 커널 모드에서 실행되며, 인터럽트 핸들러는 최대한 짧고 빠르게 동작해야 전체 시스템 지연이나 병목을 막을 수 있습니다.

 

✔️ 4. 복귀 및 상태 복원

▸ 인터럽트 처리가 끝나면, CPU는 저장해둔 상태를 불러와 이전 작업을 계속 실행합니다.

▸ 이처럼 인터럽트는 작업을 일시 중단하고 이벤트를 빠르게 처리한 뒤 복귀하는 구조로, 시스템의 응답성과 실시간성을 유지하는 핵심 메커니즘입니다.

반응형

 

4. 우선순위와 IRQ – 인터럽트는 어떻게 처리될까?

운영체제는 동시에 여러 인터럽트를 받을 수 있으므로 어떤 요청을 먼저 처리할지 결정하는 기준이 필요합니다. 그것이 바로 IRQ 번호와 우선순위입니다.

 

🟦IRQ(Interrupt Request) 번호란?

▸ 각 장치에는 고유한 IRQ 번호가 지정되어 있습니다.

▸ 예: 키보드(IRQ 1), 마우스(IRQ 12), 네트워크 카드(IRQ 11) 등

▸ 운영체제는 이 번호를 보고 어떤 장치에서 인터럽트가 왔는지 파악합니다.

 

🟦 우선순위는 왜 중요할까?

모든 인터럽트를 동시에 처리할 수 없기 때문에 긴급한 요청을 우선 처리해야 합니다.
예:
▸ 타이머 → 높은 우선순위 (스케줄링 핵심)
▸ 디스크 I/O → 중간
▸ 키보드 입력 → 낮은 우선순위 가능

만약 우선순위가 없거나 잘못 설정되면, 시스템은 인터럽트 폭주(interrupt storm)에 빠져 사용자 프로그램을 거의 실행하지 못하는 상태가 됩니다.

 

🟦 IRQ 충돌이란?

과거에는 하드웨어 자원을 수동으로 설정해야 했기 때문에 두 개 이상의 장치가 같은 IRQ 번호를 사용할 경우, 시스템에 오류가 발생하거나 장치가 제대로 동작하지 않는 문제가 있었습니다. 이를 IRQ 충돌이라 합니다.
🔸예: 키보드와 사운드카드가 둘 다 IRQ 5를 사용하면, 키보드를 누를 때 사운드카드가 반응하거나 둘 다 오작동하는 경우가 생김
🔸요즘은 대부분의 운영체제가 IRQ 공유 및 동적 할당(PnP, ACPI)을 지원하기 때문에 거의 발생하지 않지만, 서버나 임베디드 시스템에서는 여전히 고려 대상입니다.

 

 

🟦 실습: 내 시스템의 IRQ 확인하기

🔸 Linux에서 IRQ 확인
/proc/interrupts 파일을 열어보면 현재 시스템에서 어떤 IRQ를 누가 사용 중인지 확인할 수 있습니다.

cat /proc/interrupts

Linux에서 IRQ 확인 예시
Linux에서 IRQ 확인 예시

이 파일은 운영체제가 어떤 인터럽트를 어느 CPU가 얼마나 처리했는지를 보여주는 통계 정보입니다.
하드웨어 인터럽트, 소프트웨어 인터럽트, Hyper-V 이벤트, 타이머, 스케줄링 관련 인터럽트 등이 모두 포함되어 있습니다.

           CPU0   CPU1   CPU2 ...      ← 각 CPU 코어 번호
  8:         0      0      0           ← 각 CPU별 해당 인터럽트 처리 횟수
      IO-APIC 8-edge      rtc0         ← 인터럽트 소스 정보

 

🔸 Windows
장치 관리자의 "자세히 보기 > 자원" 탭에서 확인할 수 있습니다.
▸ Windows + X 키 누른 뒤 → 장치 관리자(M) 클릭
▸ 장치 관리자에서 아무 장치(예: 키보드, 네트워크 어댑터 등)를 우클릭
▸ [속성] 클릭
▸ “리소스(Resource)” 또는 "할당된 자원(Allocated Resources)” 선택

Windows 인터럽트 번호 확인 예시
Windows 인터럽트 번호 확인 예시

🟦 인터럽트 흐름 실습(Ubuntu) - 키보드 입력과 마우스 클릭

🔸1. 키보드 입력 감지

터미널을 열고 다음 명령어를 입력합니다.

showkey

showkey 실행 예시
showkey 실행 예시

키보드를 누르면 ASCII 코드나 스캔 코드가 출력됩니다.

이는 키보드 장치가 인터럽트를 발생시켜 커널이 즉시 처리하고 있다는 증거입니다.

 

🔸2. 장치 이벤트 확인

dmesg | tail -n 10

→ 새로운 장치 연결 시의 감지 로그나 장치 관련 오류/경고 로그가 출력될 수 있습니다

장치 이벤트 확인 예시
장치 이벤트 확인 예시

WSL 환경 또는 가상 머신에서 가상 디스크(SCSI 디스크)가 연결되는 흔적이 다수 확인됩니다.

sda, sdb, sdc는 가상 디스크(예: root 파일 시스템, swap, 추가 데이터 디스크)입니다.

이 메시지들은 가상화된 스토리지가 시스템에 정상적으로 연결되었다는 의미입니다

 

✔ 마무리 - 개발 실무 관점에서 본 인터럽트의 중요성

인터럽트는 운영체제 내부의 개념으로 보일 수 있지만, 시스템 프로그래밍, 드라이버 개발, 실시간 처리, 임베디드 개발 등 다양한 실무 영역에서 직접적인 영향을 줍니다.

📌 실무에서 인터럽트 개념이 중요한 이유

🔸 저수준 디바이스 제어: 하드웨어 장치와 직접 통신하거나 드라이버를 개발할 때는, 어떤 사건이 인터럽트로 전달되는지를 이해해야 합니다. 예: 네트워크 패킷 수신, GPIO 이벤트 감지 등.

 

🔸 이벤트 기반 프로그래밍: 고급 언어나 프레임워크에서 사용하는 이벤트 루프나 콜백 구조도 결국은 인터럽트 기반 모델을 추상화한 것입니다. 리액티브 프로그래밍의 개념도 인터럽트 철학과 맞닿아 있습니다.


🔸 성능 최적화: 고성능 시스템이나 게임/미디어 앱 등에서는 인터럽트 우선순위, IRQ 스톰, 컨텍스트 스위칭 비용 등을 고려해 시스템 병목을 분석해야 합니다.


🔸 실시간 시스템 개발: RTOS나 임베디드 시스템에서는 인터럽트 처리 시간이 곧 전체 시스템 응답성을 좌우하므로, ISR(Interrupt Service Routine)의 길이와 설계 방식이 시스템의 품질을 결정합니다.


🔸 디버깅 및 로그 분석: dmesg, /proc/interrupts, IRQ 통계 등은 디바이스 이상 징후나 커널 레벨 이벤트 추적에 필수적입니다.

 

 


※ 게시된 글 및 이미지 중 일부는 AI 도구의 도움을 받아 생성되거나 다듬어졌습니다.

반응형

 

 

반응형