
안녕하딤니카?
이번 글에서는 CPU의 작동 원리 중에서, 명령어 사이클과 하드웨어 인터럽트 처리 순서에 대해서 정리해보려고 합니다.
그럼 시~~~작
1. 명령어 사이클
1-1. 일반적인 명령어 사이클
CPU는 프로그램 속 명령어들을 일정한 주기로 반복하면서 실행하는데, 이 주기를 명령어 사이클 이라고 합니다.
아래에서 명령어 사이클에 대해서 순서대로 정리해보겠습니다!
- 인출 사이클 : 가장 먼저, CPU는 메모리 안에 있는 어떤 프로그램을 실행하기 위해서 메모리에 저장된 값을 CPU 내부로 가져와야 합니다. 이 작업을 인출 이라고 하며, 이 주기를 인출 사이클 이라고 합니다.
- 실행 사이클 : 프로그램을 실행하기 위해서 메모리에 저장된 값을 인출했다면, 이제는 CPU가 그 값을 실행하게 되는데, 그것을 실행 사이클 이라고 합니다.
일반적으로 CPU는 인출 - 실행 - 인출 - 실행 이런 식으로 두 사이클을 반복합니다. 이 과정을 명령어 사이클의 일부라고 보면 됩니다.

그런데, CPU로 명령어를 가지고 와도 바로 실행이 불가능한 경우도 있습니다. 추가적으로 메모리에 접근해야 되는 경우가 있습니다. (간접 주소지정 방식)
이런 경우에는 인출을 해도 바로 실행이 불가능하고, 몇 번 더 메모리 접근을 해야 될 수 있습니다. 이런걸 간접 사이클이 추가된다고 말하는데, 이러면 인출 - 간접 - 실행 이 순서로 사이클이 반복됩니다.
보통 일반적으로는 인터럽트 라는 개념이 없다면 CPU는 이 주기를 바탕으로 프로그램을 실행합니다.
1-2. 인터럽트
그런데 여기서 인터럽트 라는 개념이 생기는데, 인터럽트는 이렇게 정해진 흐름대로 CPU가 프로그램을 처리하다가 흐름을 끊어버리고 치고 들어오는 것을 인터럽트라고 합니다.
인터럽트(interrupt)는 방해하다, 중단시키다 라는 뜻을 가지고 있는데, CPU가 정해진 사이클보다 얼른 처리해야 할 다른 작업이 생겼을 때 발생합니다. 인터럽트의 종류에는 동기 인터럽트(예외, exception) 와 비동기 인터럽트(하드웨어 인터럽트) 가 있습니다.
- 동기 인터럽트 (예외, exception) : CPU가 예기치 못한 상황을 접했을 때 발생합니다. CPU는 명령어 사이클에 맞춰서 프로그램을 실행하다가, 이 예외적인 상황은 뭐지? 라고 감지해서 사이클을 중단하고 해당 인터럽트를 먼저 처리하는데, 이걸 동기 인터럽트 라고 합니다. 동기 인터럽트는 폴트, 트랩, 중단, 소프트웨어 인터럽트 이렇게 네 가지 종류로 나눠집니다.
- 비동기 인터럽트 (하드웨어 인터럽트) : 주로 입출력 장치에서 발생합니다. 동기 인터럽트는 문제쪽에 가깝다면, 비동기 인터럽트는 알림쪽에 더 가까운데, 다른 하드웨어가 보내주는 알림 역할을 하는 것이 바로 비동기 인터럽트입니다. CPU가 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 사용합니다.

입출력장치는 CPU에 비해 처리속도가 느린 편인데, 하드웨어 인터럽트가 없다면 CPU는 입출력장치가 수행하는 명령 완료 여부를 확인하기 위해 주기적으로 처리 경과를 확인해줘야 합니다. 그러나 인터럽트가 있다면 입출력 작업을 하는 동안 CPU는 다른 일을 할 수 있기 때문에 효율적인 작업을 할 수 있습니다.
하드웨어 인터럽트의 처리 순서는 아래와 같은데, 사실 인터럽트의 처리 순서는 동기 / 비동기가 크게 다르진 않고, 둘 다 비슷비슷합니다. 일단 하드웨어 인터럽트의 처리 순서 기준으로 정리해 보겠습니다!
- 입출력장치는 CPU에 인터럽트 요청 신호를 보냅니다. 인터럽트 요청 신호는 CPU의 작업을 방해하는 인터럽트에 대한 요청입니다.
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인합니다.
- CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인합니다. 인터럽트 플래그란, 인터럽트 요청 신호를 받아들일지, 무시할지를 결정하는 비트입니다. (다만, 모든 인터럽트를 인터럽트 플래그로 막을 수 있는건 아닙니다. 진짜 정말 급한 인터럽트, 그니까 하드웨어 고장 또는 정전 같은 진짜로 엄청 급한 인터럽트는 인터럽트 플래그로 막을 수 없습니다. 이렇게 인터럽트 플래그로 막을 수 없는 인터럽트를 Non-Maskable Interrupt, NMI 라고 합니다.)
- 인터럽트를 받아들일 수 있다면, CPU는 지금까지의 작업을 스택 영역에 백업합니다.
- CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행합니다. 인터럽트 벡터는 인터럽트 서비스 루틴의 시작 주소를 포함하는 인터럽트 서비스 루틴의 식별 정보를 뜻하며, 인터럽트 서비스 루틴은 인터럽트를 처리하는 프로그램을 뜻합니다. 인터럽트 서비스 루틴도 프로그램이기 때문에, 일반적으로 메모리에 저장되어 있습니다. 그리고 인터럽트를 보내는 주체에 따라서 각기 다른 인터럽트 서비스 루틴의 시작 주소를 가지고 있습니다.
- 인터럽트 서비스 루틴 실행이 끝나면, 4번에서 백업해 둔 작업을 복구하여 실행을 재개합니다.

그래서 정리하자면, 'CPU가 인터럽트를 처리한다.' 라는 말은 곧, '인터럽트 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아온다. 그리고 인터럽트의 시작 주소는 인터럽트 백터를 통해 알 수 있다.' 라고 풀어 쓸 수 있습니다.
2. 정리
결국 CPU는 메모리에 있는 프로그램을 실행할 때, 명령어 사이클(인출 - 실행의 반복)에 맞춰서 실행하게 되는데, 인출 사이클에서 메모리 접근이 더 필요한 경우에는 간접 사이클이 발생하고, 실행 사이클에서 인터럽트가 발생한다면 인터럽트 사이클을 수행합니다. 이런 정형화된 흐름에 따라서 처리하는 것이 명령어 사이클이다 라고 정리할 수 있습니다.
CPU의 작동 원리를 명령어 사이클, 그리고 하드웨어 인터럽트를 중심으로 정리해봤습니다! 글은 여기서 마치겠습니다.
그럼 20000~
[자료 출처]
강민철, 《혼자 공부하는 컴퓨터 구조+운영체제》, 한빛미디어, 2022
인프런 - 개발자를 위한 컴퓨터공학 1 : 혼자 공부하는 컴퓨터구조 + 운영체제
🍀
좋아하는 것을 계속 좋아하세요!
반드시 행복해집니다
백엔드 개발자가 되고 싶어서 열심히 헤딩 중인 재영입니다 :-)
[Github] https://github.com/chujaeyeong
[E-mail] chujy1224@gmail.com
'Study > 컴퓨터구조, 운영체제' 카테고리의 다른 글
| 프로세스 상태와 계층 구조에 대해 정리해보자 (0) | 2025.01.07 |
|---|---|
| 프로세스의 개요와 PCB, 메모리 영역에 대해 정리해보자 (0) | 2025.01.07 |
| RAID의 정의와 종류를 정리해보자 (0) | 2025.01.05 |
| 메모리의 물리 주소와 논리 주소 정리 (2) | 2025.01.03 |
| 문자열 인코딩을 정리해보자 (아스키 코드, EUC-KR, UTF) (5) | 2024.12.27 |