In Veritate Libertas

The Restricted
Section

A collection of spells,
experiments, and forbidden knowledge.

Study/[ OS ] | 2026. 6. 23. 18:45

#05 인터럽트 Interrupt

728x90

인터럽트 — CPU가 하던 일을 멈추는 순간

OS 공부하면서 인터럽트가 계속 등장하는데, 사실 앞에서 이미 여러 번 만났어. 컨텍스트 스위칭 할 때도, 시스템 콜 할 때도, I/O 처리할 때도. 그때마다 "인터럽트가 발생해서" 라는 말이 나왔는데, 이번에 제대로 정리해보자.


인터럽트가 왜 필요해?

자, 일단! 프로세서에 이벤트를 알려서 현재 하던 명령의 위치를 저장한 후 중단하고 다른 일을 하도록 처리하는 비동기적 방법이 인터럽트야. 그럼 인터럽트가 없으면 어떻게 될지 생각해보자.

프린터한테 "출력해"라고 요청을 보냈어. 프린터가 끝날 때까지 CPU는 뭘 해야 해? 인터럽트가 없으면 CPU가 계속 프린터 상태를 확인하는 루프를 돌아야 해.

while (프린터 안 끝남) {
    // CPU가 아무것도 못 하고 계속 기다림
    // 이게 Busy Waiting이야
}

이 시간 동안 CPU는 다른 연산을 전혀 못 해. 순수한 낭비야.

인터럽트가 있으면 달라져. CPU는 프린터에 요청만 보내고 다른 일을 계속 해. 프린터가 끝나면 "나 끝났어"라는 신호(인터럽트)를 CPU에 보내고, CPU는 그때 잠깐 하던 일을 멈추고 프린터 결과를 처리해.

인터럽트가 없는 세상은 CPU가 항상 뭔가를 기다리며 멈춰있는 세상이라는 거야. 현대 컴퓨터가 이렇게 많은 걸 동시에 처리하는 게 인터럽트 덕분이야.


인터럽트의 종류

인터럽트는 크게 하드웨어 인터럽트소프트웨어 인터럽트(트랩) 두 종류야.

 

하드웨어 인터럽트

외부 하드웨어 장치가 CPU에 신호를 보내는 방식이야.

첫째, 일반적인 하드웨어 인터럽트.

키보드, 마우스, 프린터 같은 I/O 장치의 컨트롤러가 CPU 서비스를 요청하기 위해 발생시켜. 키보드 키를 누르면 키보드 컨트롤러가 CPU에 인터럽트를 걸어서 "입력이 들어왔어"라고 알려주는 거야.

둘째, 타이머 인터럽트.

OS가 각 프로세스에 공평하게 CPU 시간을 주기 위해 써. 앞에서 봤던 Round Robin 스케줄링이 이걸로 동작해. 할당 시간이 끝나면 타이머가 인터럽트를 발생시키고, OS가 CPU를 다음 프로세스에 넘겨.

프로세스 A 실행 중...
    ↓ (타이머 인터럽트 발생 — 시간 초과)
OS가 컨텍스트 스위칭 수행
    ↓
프로세스 B 실행 중...

 

소프트웨어 인터럽트 (트랩, Trap)

하드웨어가 아닌 소프트웨어 내부에서 발생해. CPU가 명령어를 실행하다가 스스로 인터럽트를 발생시키는 방식이야.

첫째, 예외 상황(Exception).

프로그램이 허용되지 않은 연산을 수행하려 할 때 자동으로 발생해.

  • 0으로 나누기 (ArithmeticException)
  • 권한 없는 메모리 참조 (Segmentation Fault)
  • 스택 오버플로우

둘째, 시스템 콜(System Call).

프로세스가 OS 서비스를 요청할 때 발생해. 앞에서 다뤘던 시스템 콜이 사실 소프트웨어 인터럽트야.

유저 프로그램: 파일 읽기 요청
    ↓ (시스템 콜 → 트랩 발생)
유저 모드 → 커널 모드 전환 (modebit 1 → 0)
    ↓
OS 커널이 파일 읽기 처리
    ↓
커널 모드 → 유저 모드 복귀 (modebit 0 → 1)
    ↓
유저 프로그램: 결과 받음

 

  하드웨어 인터럽트  소프트웨어 인터럽트(트랩)
발생 원인 외부 장치 프로그램 내부
예시 키보드 입력, 타이머 0나누기, 시스템 콜
발생 시점 예측 불가 (비동기) 명령어 실행 중 (동기)

명령어 사이클과 인터럽트

인터럽트가 발생했다고 CPU가 바로 실행을 멈추진 않아. 현재 실행 중인 명령어 사이클이 끝난 후에 인터럽트를 처리해.

Fetch(명령어 가져옴)
    ↓
Decode(해석)
    ↓
Execute(실행)  ← 이 사이클이 끝나야
    ↓
인터럽트 체크 → 인터럽트 있으면 처리, 없으면 다음 Fetch

명령어 실행 중간에 갑자기 끊으면 CPU 상태가 일관성 없이 망가져. 그래서 한 명령어가 완전히 끝난 시점에서 인터럽트를 확인하고 처리하는 거야.


인터럽트 서비스 루틴 (ISR)

인터럽트 핸들러라고도 해. 인터럽트가 발생했을 때 실제로 처리를 담당하는 코드야.

OS 커널 안에 인터럽트 종류별로 ISR이 미리 정의되어 있어. 타이머 인터럽트용 ISR, 키보드 인터럽트용 ISR, 이런 식으로.

인터럽트 벡터(Interrupt Vector)는 각 인터럽트 번호와 해당 ISR의 주소를 연결해둔 테이블이야. 인터럽트가 발생하면 CPU가 이 테이블을 참조해서 어떤 ISR을 실행할지 찾아.

인터럽트 벡터 테이블
┌───────────────────────────────────┐
│ 인터럽트 번호 0 → 0나누기 ISR 주소  │
│ 인터럽트 번호 1 → 키보드 ISR 주소   │
│ 인터럽트 번호 2 → 타이머 ISR 주소   │
│ ...                               │
└───────────────────────────────────┘

ISR이 하는 일은 세 가지야.

  1. 현재 실행 중이던 레지스터와 PC 값을 저장 (CPU 상태 보존)
  2. 인터럽트 처리
  3. 저장해뒀던 상태로 복원 후 원래 실행 위치로 복귀

인터럽트 처리 전체 흐름

단계별로 따라가 보면 이래.

여기서 2단계 "현재 상태 저장"이 바로 컨텍스트 스위칭이야. 인터럽트 처리와 컨텍스트 스위칭이 연결되어 있는 거야. 프로세스/스레드 파트에서 컨텍스트 스위칭을 다뤘는데, 그 트리거 중 하나가 인터럽트야.

 

한 가지 더 — 인터럽트는 중첩될 수 있어. 인터럽트를 처리하는 도중에 더 높은 우선순위의 인터럽트가 들어오면, 현재 ISR을 중단하고 새 인터럽트부터 처리하는 경우도 있어. 이걸 인터럽트 우선순위라고 해. 대부분의 OS는 마스킹(Masking) 기법으로 특정 인터럽트를 잠깐 무시할 수 있게 해줘.


면접 대비 핵심 질문은 더보기 누르면 볼 수 있어!

더보기

Q. 인터럽트란? 프로세서에 이벤트를 알려 현재 실행 중인 작업을 일시 중단하고 다른 일을 처리하게 하는 비동기적 메커니즘이야. CPU가 장치 상태를 계속 확인하는 Busy Waiting 없이 효율적으로 자원을 활용할 수 있게 해줘.

Q. 하드웨어 인터럽트와 소프트웨어 인터럽트(트랩)의 차이는? 하드웨어 인터럽트는 키보드, 타이머 같은 외부 장치가 발생시키는 비동기 인터럽트야. 소프트웨어 인터럽트(트랩)는 프로그램 실행 중 내부에서 발생해. 0나누기 같은 예외 상황과 OS 서비스를 요청하는 시스템 콜이 여기 해당해.

Q. 인터럽트 발생 시 처리 과정은? 명령어 사이클 완료 → 현재 상태(PC, 레지스터) 저장 → 인터럽트 벡터에서 ISR 주소 확인 → ISR 실행 → 저장한 상태 복원 → 원래 실행 위치로 복귀.

Q. 왜 인터럽트 발생 즉시 처리하지 않고 명령어 사이클이 끝난 후 처리해? 명령어 실행 중간에 멈추면 CPU 상태가 불일관된 상태가 돼. 현재 명령어가 완전히 끝난 시점에서 인터럽트를 처리해야 안전하게 상태를 저장하고 복원할 수 있어.

Q. ISR(인터럽트 서비스 루틴)이란? 인터럽트 핸들러라고도 해. 인터럽트가 발생했을 때 실제 처리를 담당하는 커널 코드야. CPU 상태를 보존하고 인터럽트를 처리한 뒤 원래 상태로 복구해. 인터럽트 벡터 테이블을 통해 해당 ISR의 주소를 찾아서 실행해.


오늘 공부는 여기서 끝!

728x90

'Study > [ OS ]' 카테고리의 다른 글

#07 PCB & Context Switching  (0) 2026.07.02
#06 시스템콜 System Call  (0) 2026.06.24
#04 CPU 스케줄링 알고리즘  (0) 2026.06.22
#03 프로세스와 스레드  (0) 2026.06.20
#02 메모리 계층  (0) 2026.06.18
흐이서

흐이서

Writer

공순이 흐이서