인터럽트(Interrupt)란? 하드웨어 인터럽트 vs 소프트웨어 인터럽트
1. 인터럽트(Interrupt)란?
컴퓨터에서 프로세스는 CPU에서 명령어를 순차적으로 실행한다. 하지만 실행 도중에 예기치 않은 이벤트(입출력 요청, 오류 발생, 사용자 입력 등)가 발생할 수 있다. 이때, CPU가 현재 실행 중인 작업을 멈추고 해당 이벤트를 처리할 수 있도록 도와주는 메커니즘이 바로 **인터럽트(Interrupt)**이다.
즉, 인터럽트는 컴퓨터 시스템이 특정 이벤트에 신속하게 반응할 수 있도록 하는 중요한 기능이다. 인터럽트가 발생하면, CPU는 현재 실행 중인 작업을 잠시 중단하고, 운영체제가 해당 이벤트를 처리할 수 있도록 제어를 넘긴다.
1-1. 인터럽트가 없으면 어떻게 될까?
만약 인터럽트가 존재하지 않는다면, 운영체제는 외부 장치(키보드, 마우스, 네트워크 등)의 상태를 계속해서 확인(Polling)해야 한다. 이 방식은 CPU 리소스를 낭비할 뿐만 아니라, 빠르게 반응해야 하는 이벤트(예: 마우스 클릭, 네트워크 데이터 수신)를 적시에 처리하지 못하는 문제가 발생할 수 있다.
📌 예제: 키보드 입력이 없는 경우
- CPU는 매초마다 키보드의 입력을 확인해야 하며, 사용자가 입력을 하지 않는 동안에도 CPU는 계속해서 키보드 상태를 검사해야 함
- 하지만 인터럽트가 있으면, 사용자가 키를 눌렀을 때만 CPU가 이를 처리하므로 불필요한 CPU 자원 낭비가 사라짐
1-2. 인터럽트의 기본 원리
인터럽트가 발생하면 CPU는 다음과 같은 절차를 따른다.
1️⃣ 현재 실행 중인 프로세스의 상태 저장
- CPU는 현재 실행 중이던 프로그램의 상태(레지스터 값, 프로그램 카운터 등)를 저장한다.
2️⃣ 인터럽트 원인 분석
- CPU는 인터럽트가 발생한 원인을 **인터럽트 벡터 테이블(Interrupt Vector Table, IVT)**을 통해 확인한다.
3️⃣ 인터럽트 핸들러(Interrupt Handler) 실행
- 운영체제는 해당 인터럽트를 처리하는 핸들러(예: 키 입력 처리, 네트워크 데이터 수신 등)를 실행한다.
4️⃣ 원래 프로세스로 복귀
- 인터럽트 처리가 완료되면 CPU는 저장된 프로세스 상태를 복원하고 원래 수행하던 작업을 이어서 실행한다.
2. 인터럽트의 필요성
인터럽트는 운영체제의 핵심적인 기능 중 하나로, 여러 가지 중요한 역할을 수행한다.
2-1. 즉각적인 이벤트 처리 가능
운영체제가 인터럽트를 활용하면 입출력 장치(키보드, 마우스, 네트워크 등)에서 발생하는 이벤트를 즉시 처리할 수 있다.
📌 예제: 키보드 입력 처리
- 사용자가 키보드를 누르면, 하드웨어 인터럽트가 발생하여 CPU가 즉시 해당 입력을 처리
- 만약 인터럽트가 없으면, CPU가 계속해서 키보드 입력 여부를 확인해야 하므로 불필요한 연산이 발생
2-2. CPU 자원 낭비 방지
인터럽트가 없다면, 운영체제는 모든 장치(키보드, 마우스, 네트워크 등)의 상태를 지속적으로 확인하는 폴링(Polling) 방식을 사용해야 한다.
하지만 이 방식은 CPU 리소스를 비효율적으로 사용하므로, 인터럽트를 이용하면 불필요한 CPU 사용을 줄이고 중요한 작업에 집중할 수 있다.
📌 예제: 프린터 사용
- 사용자가 문서를 프린터에 출력하면, CPU는 프린터가 인쇄를 완료할 때까지 기다리지 않는다.
- 대신 인터럽트를 활용하여, 프린터가 출력 완료 후 CPU에게 알림을 보낸다.
- 그동안 CPU는 다른 작업을 수행할 수 있어 시스템 성능이 향상됨
2-3. 멀티태스킹 지원
인터럽트는 멀티태스킹(Multitasking)을 가능하게 하는 핵심 기술이다.
운영체제는 인터럽트를 이용해 여러 개의 프로세스를 빠르게 전환하며 실행할 수 있다.
📌 예제: 웹 브라우저에서 동영상 재생 중 채팅하기
- 사용자가 YouTube에서 영상을 시청하면서 채팅 앱에서 메시지를 입력하면, 두 개의 프로세스가 동시에 실행되는 것처럼 보인다.
- 운영체제는 인터럽트를 활용하여 두 개의 프로세스를 빠르게 전환하며 실행
2-4. 시스템 안정성 및 오류 처리 제공
인터럽트는 시스템 오류(Exception)나 예외 상황을 감지하고 운영체제가 적절한 대응을 할 수 있도록 지원한다.
📌 예제: 0으로 나누기 오류
- 프로그램에서 숫자를 0으로 나누는 연산이 실행되면, CPU는 "Divide by Zero" 인터럽트를 발생
- 운영체제는 해당 오류를 감지하고 프로그램을 강제 종료하거나 예외 처리를 수행
📌 예제: 메모리 접근 오류(Segmentation Fault)
- 프로그램이 허용되지 않은 메모리 영역을 접근하면, CPU가 메모리 접근 오류 인터럽트를 발생
- 운영체제는 해당 프로세스를 종료하거나 적절한 조치를 취함
2-5. 실시간 시스템에서의 중요성
인터럽트는 실시간 시스템(Real-Time System)에서 빠른 응답 속도를 보장하는 필수적인 요소이다.
예를 들어, 자동차의 ABS(Anti-lock Braking System) 같은 긴급한 데이터 처리가 필요한 시스템에서는 인터럽트가 없으면 동작이 지연될 수 있다.
📌 예제: 자동차 ABS 시스템
- 자동차가 급정거할 때, 브레이크 센서에서 "바퀴가 미끄러지고 있음"이라는 신호를 보내면 CPU는 즉시 이를 감지하여 제동 시스템을 조정
- 만약 인터럽트가 없다면, CPU가 주기적으로 바퀴 상태를 확인해야 하고, 반응 속도가 늦어져 사고 위험 증가
3. 인터럽트의 종류
인터럽트는 크게 **하드웨어 인터럽트(Hardware Interrupt)**와 **소프트웨어 인터럽트(Software Interrupt)**로 나뉜다.
구분 | 설명 | 예시 |
하드웨어 인터럽트 | 외부 장치(키보드, 마우스, 네트워크 등)에서 발생하는 인터럽트 | 키 입력, 마우스 클릭, 프린터 완료, 네트워크 데이터 수신 |
소프트웨어 인터럽트 | 프로그램이 특정 명령을 실행하여 발생하는 인터럽트 | 시스템 호출(System Call), 예외(Exception), 오류(Divide by Zero) |
3-1. 하드웨어 인터럽트(Hardware Interrupt)
하드웨어 인터럽트는 CPU 외부에서 발생하는 인터럽트로, 하드웨어 장치가 CPU에 작업 처리를 요청할 때 발생한다.
CPU는 외부 장치의 요청을 우선 처리하고, 작업이 완료되면 원래 프로세스로 복귀한다.
📌 하드웨어 인터럽트의 주요 예시
- 키보드 입력 → 사용자가 키를 누르면 인터럽트가 발생하여 운영체제가 키 입력을 처리
- 마우스 클릭 → 마우스 버튼을 클릭하면, CPU가 인터럽트를 받아 클릭 이벤트를 처리
- 프린터 완료 → 문서 출력이 완료되면 인터럽트가 발생하여 운영체제가 알림
- 네트워크 패킷 수신 → 데이터가 네트워크를 통해 수신되면 인터럽트가 발생하여 처리
📌 하드웨어 인터럽트의 처리 과정
- CPU는 현재 실행 중인 작업을 중단
- 인터럽트 컨트롤러(Interrupt Controller)가 인터럽트를 감지하고 CPU에 신호 전달
- CPU는 인터럽트 벡터 테이블(Interrupt Vector Table, IVT)을 참조하여 적절한 인터럽트 핸들러 실행
- 인터럽트 핸들러가 요청을 처리한 후, CPU는 원래 작업으로 복귀
3-2. 소프트웨어 인터럽트(Software Interrupt)
소프트웨어 인터럽트는 프로그램 내부에서 발생하는 인터럽트로, 운영체제와의 상호작용을 위해 프로세스가 의도적으로 인터럽트를 발생시키는 경우에 사용된다.
📌 소프트웨어 인터럽트의 주요 예시
- 시스템 호출(System Call) → 프로세스가 운영체제의 기능(파일 열기, 메모리 할당 등)을 요청할 때 발생
- 예외(Exception) 발생 → 0으로 나누기(Divide by Zero) 또는 접근 권한 위반(Segmentation Fault) 등
- 디버깅(Debugging) 인터럽트 → 프로그램 실행을 중단하고 개발자가 코드를 확인할 수 있도록 중단점(Breakpoint) 설정
📌 소프트웨어 인터럽트의 처리 과정
- 프로그램이 인터럽트 명령을 실행 (예: 시스템 호출)
- CPU가 인터럽트 벡터 테이블을 참조하여 적절한 핸들러 실행
- 핸들러가 요청된 작업을 수행한 후, CPU는 원래 프로그램 실행을 계속
4. 인터럽트 처리 과정
인터럽트가 발생하면, 운영체제는 다음과 같은 과정으로 인터럽트를 처리한다.
1️⃣ 현재 실행 중인 프로세스 상태 저장
- 실행 중인 프로세스의 프로그램 카운터(PC), 레지스터 값 등을 저장하여 나중에 다시 실행할 수 있도록 함
2️⃣ 인터럽트 벡터 테이블(Interrupt Vector Table) 조회
- CPU는 인터럽트의 종류를 확인하고, 적절한 인터럽트 핸들러(Interrupt Handler)를 실행
3️⃣ 인터럽트 핸들러 실행
- 해당 인터럽트에 대한 작업 수행 (예: 키보드 입력을 처리하거나, 네트워크 패킷을 읽어들임)
4️⃣ 원래 프로세스로 복귀
- 인터럽트 처리 완료 후, CPU는 원래 실행 중이던 프로세스로 돌아감
5. 인터럽트 vs 폴링(Polling)
운영체제가 외부 장치의 이벤트를 처리하는 방법은 인터럽트 방식과 폴링 방식으로 나뉜다.
구분 | 인터럽트 방식 | 폴링 방식 |
처리 방식 | 이벤트 발생 시 CPU가 요청을 받음 | CPU가 주기적으로 장치를 검사 |
CPU 효율 | CPU가 다른 작업을 수행할 수 있음 | CPU가 지속적으로 장치 상태를 확인해야 함 |
예시 | 키보드 입력, 네트워크 패킷 수신 | CPU가 프린터의 상태를 반복적으로 확인 |
일반적으로 인터럽트 방식이 CPU 자원을 효율적으로 사용할 수 있어 더 많이 사용됨
6. 인터럽트 최적화 기법
인터럽트가 과도하게 발생하면 시스템 성능이 저하될 수 있다. 이를 방지하기 위해 다음과 같은 최적화 기법을 사용한다.
- 인터럽트 병합(Interrupt Coalescing)
- 여러 개의 인터럽트를 묶어서 한 번에 처리하여 CPU 부하를 줄이는 방식
- DMA(Direct Memory Access) 활용
- CPU를 거치지 않고, 장치가 직접 메모리에 데이터를 전송하도록 하여 인터럽트 횟수를 줄임
- 인터럽트 우선순위 지정(Priority-Based Interrupt Handling)
- 중요한 인터럽트는 우선 처리하고, 중요도가 낮은 인터럽트는 대기