인터럽트의 정의
📌 인터럽트란 CPU가 특정 기능을 수행하는 도중에 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능이다. 갑자기 키보드 입력과 같은 이벤트가 발생하면 인터럽트를 걸어 인터럽트 서비스 루틴(ISR)을 실행한다.
- 언뜻 보면 컴퓨터 구조의 분기 명령과 비슷하다고 볼 수 있는데 분기는 함수 호출과 같이 예기치 못한 상황이 아니고 동기적으로 일어나지만 인터럽트는 예기치 못하게 즉, 비동기적으로 일어난다.
- 예를 들어서 설명해 보자. 키보드의 키를 하나 누르면, 눌려진 키 코드 값이 키보드 버퍼에 입력된 후 CPU에 인터럽트가 걸린다. 그럼 현재 처리하던 작업에 대한 정보를 수집하여 저장한 뒤에 인터럽트 서비스 루틴(Interrupt Service Routine)을 수행한다.
인터럽트 발생 상황
1️⃣ 하드웨어 인터럽트 (외부 인터럽트) → 외부 장치 요청
📌 I/O 장치, 타이머, 외부 신호에 의해 발생
- I/O 인터럽트 → 키보드 입력, 마우스 클릭, 프린터 완료 등
- 타이머 인터럽트 → 특정 시간 간격마다 발생 (운영체제에서 CPU 스케줄링 등에 사용)
- 전원 장애 인터럽트 → 전원 문제 발생 시 시스템 안전 종료
- 외부 신호 인터럽트 → 네트워크 패킷 수신, 하드웨어 장치의 특별한 요청
2️⃣ 소프트웨어 인터럽트 (내부 인터럽트) → CPU 내부에서 발생
📌 프로그램 실행 중 예외 상황이 발생하면 CPU가 자동 처리
- 예외(Exception) 인터럽트 → 0으로 나누기, 오버플로우 발생
- 잘못된 명령어 실행 → 존재하지 않는 명령어를 실행하려 할 때
- 시스템 호출(Syscall) → 프로그램이 운영체제 기능(파일 읽기, 메모리 할당 등)을 요청할 때
- 페이지 폴트(Page Fault) → 프로세스가 메모리에 없는 페이지를 참조할 때
인터럽트 처리 과정
1️⃣ 인터럽트 발생 (Interrupt Occurs)
- 하드웨어(키보드 입력, 타이머, 입출력 완료 등) 또는 소프트웨어(예외, 시스템 호출)에서 인터럽트 신호가 발생
2️⃣ 현재 작업 상태 저장 (Context Saving)
- 현재 실행 중이던 프로그램의 상태를 저장
- PC(프로그램 카운터): 현재 실행 중인 명령어의 다음 주소 저장
- 레지스터 값: 현재 작업을 나중에 다시 수행할 수 있도록 저장
- 저장 위치: 보통 스택(Stack) 또는 특수 레지스터
3️⃣ 인터럽트 서비스 루틴(ISR) 실행 (Execute ISR)
- CPU가 해당 인터럽트의 ISR(Interrupt Service Routine)을 실행
4️⃣ 원래 상태 복원 (Context Restoration)
- ISR이 끝나면 저장했던 PC와 레지스터 값을 복원
- CPU는 원래 실행 중이던 프로그램으로 돌아감
5️⃣ 원래 프로그램 실행 재개 (Resume Execution)
- 인터럽트 발생 전에 수행 중이던 프로그램을 그대로 이어서 실행
인터럽트 사용 이유
- CPU가 I/O작업이 끝날 때 까지 기다릴 필요 없이 다른 작업을 할 수 있음. 입력 상황이 발생되면 인터럽트를 보내고, CPU는 현재 작업을 계속 수행하고 입력이 완료되어 ENTER을 누르게 되면 다시 인터럽트를 보내 현재 작업을 잠시 중단한 뒤 인터럽트 서비스 루틴(ISR)을 수행함.
- 실시간 응답 처리가 가능
- 멀티태스킹 지원
- 오류 처리 및 안정성 유지
인터럽트가 포함된 명령어 사이클

- CPU(처리기)는 인터럽트 발생 여부 검사
- 인터럽트가 발생하지 않았으면 지금 수행중인 프로그램의 다음 명령어 반입
- 인터럽트가 있으면, 현재 프로그램의 실행을 멈추고, 인터럽트 처리 루틴 실행
인터럽트 발생 시 메모리와 레지스터의 상태변화

(a) 위치 N의 명령어 실행 후 인터럽트 발생
- 프로그램 카운터(CP)에 사용자 프로그램에서 다음 실행할 명령어의 주소인 N+1 저장. 스택 포인터에는 제어스택의 주소인 T가 저장됨
- 인터럽트 서비스 루틴이 시작되면 제어스택에 N+1과 범용 레지스터 값들을 저장해놓고 초기화 시킨 후 스택 포인터는 프로그램 카운터와 범용 레지스터 값을 뺀 M인 T-M의 값이 들어가게 되어 인터럽트 서비스 루틴을 실행하게 됨
(b) 인터럽트로부터 복귀
- 인터럽트 서비스 루틴이 전부 실행된 복귀 주소는 Y+L이기 때문에 프로그램 카운터가 Y+L+1이 되면 기존의 사용자 프로그램의 다음 주소인 N+1이 저장되어있던 제어스택의 주소에서 N+1 을 갖고와 프로그램 카운터가 N+1로 되돌아오고, 범용 레지스터 값도 돌아옴. 스택 포인터도 T-M에서 T로 변하게 되어 처음 인터럽트 발생 전 상황으로 돌아가게 된 것을 볼 수 있음