명령어 사이클 (Instruction Cycle)
명령어 사이클은 CPU가 메모리에서 명령어 하나를 꺼내 와서 실행을 마칠 때까지 거치는 일련의 단계입니다. CPU는 프로그램이 끝날 때까지 이 사이클을 계속 반복합니다.
한눈에 보기
- 비유: 요리사가 레시피를 따라 요리하는 과정과 같습니다.
- 책갈피(PC)가 꽂힌 줄을 보고 레시피 한 줄을 읽어 옵니다. (인출)
- 그 줄이 무슨 뜻인지 이해합니다. "냉장고 3번 칸의 양파를 볶아라" (해독)
- 실제로 냉장고에서 양파를 꺼내 볶습니다. (실행)
- 책갈피를 다음 줄로 옮기고 1번으로 돌아갑니다.
- 이 과정에서 CPU 안의 여러 레지스터가 각자 맡은 값을 잠깐씩 들고 있습니다.
등장하는 레지스터와 장치
| 이름 | 하는 일 |
|---|---|
| PC (프로그램 카운터) | 다음에 실행할 명령어의 주소를 저장 |
| MAR (메모리 주소 레지스터) | 다음에 읽거나 쓸 기억장소의 주소를 지정 |
| MBR (메모리 버퍼 레지스터) | 기억장치에 저장할 데이터, 또는 기억장치에서 읽은 데이터를 임시 저장 |
| IR (명령어 레지스터) | 현재 수행 중인 명령어를 저장 |
| ALU (산술논리연산장치) | 산술 연산과 논리 연산을 수행 |
각 구성 요소의 역할은 CPU 작동 원리에서 더 자세히 다룹니다.
전체 흐름
명령어 사이클은 인출, 간접, 실행, 인터럽트 네 가지 사이클로 나뉩니다. 간접 사이클과 인터럽트 사이클은 필요할 때만 거칩니다.
┌─────────────────────────────────────────────┐
▼ │
┌─────────────┐ 간접 주소면 ┌─────────────┐ │
│ 인출 사이클 │ ─────────────▶ │ 간접 사이클 │ │
│ (Fetch) │ │ (Indirect) │ │
└──────┬──────┘ └──────┬──────┘ │
│ 직접 주소면 │ │
▼ ▼ │
┌──────────────────────────────────────────┐ │
│ 실행 사이클 (Execute) │ │
└─────────────────────┬────────────────────┘ │
│ │
인터럽트 요청이 있었나? │
├── 없음 ──────────────────────────────────┤
└── 있음 ─▶ 인터럽트 사이클 (Interrupt) ────┘인출 사이클 (Fetch Cycle)
다음에 실행할 명령어를 주기억장치에서 CPU의 명령어 레지스터(IR)로 가져오는 단계
- PC에 있는 명령어 주소를 MAR로 가져옵니다.
- MAR에 저장된 주소에 해당하는 값을 메모리에서 가져와 MBR에 저장합니다. 이와 동시에 PC를 증가시켜 다음 명령어를 가리키게 합니다.
- MBR에 있는 명령어를 IR로 옮깁니다.
T0 : MAR ← PC
T1 : MBR ← M[MAR], PC ← PC + 1
T2 : IR ← MBR- 인출 사이클에서 가져오는 것은 항상 명령어(연산 코드 + 피연산자)입니다. 계산에 쓸 데이터는 이후 간접 사이클이나 실행 사이클에서 따로 읽어 옵니다.
PC + 1은 "다음 명령어"라는 뜻이고, 실제로는 명령어 하나의 크기(예: 4바이트)만큼 주소가 증가합니다.
해독 (Decode)
IR에 들어온 명령어는 제어장치가 해석합니다.
- 연산 코드(Opcode)를 보고 "이건 더하기다", "이건 메모리에 저장하라는 뜻이다"를 알아냅니다.
- 그 결과에 맞는 제어 신호를 만들어 ALU, 레지스터, 메모리 등에 보냅니다.
IR은 명령어를 들고 있는 곳이고, 해석은 제어장치(그 안의 명령어 해독기)가 합니다. 해독은 명령어를 데이터로 바꾸는 것이 아니라, 명령어를 각 장치에 보낼 신호로 바꾸는 것입니다. 교재에 따라 해독을 인출 사이클의 끝부분이나 실행 사이클의 앞부분에 포함시키기도 합니다.
간접 사이클 (Indirect Cycle)
피연산자 자리에 데이터가 있는 곳의 주소가 바로 적혀 있지 않고, "주소가 적혀 있는 곳의 주소" 가 적혀 있을 때 거치는 단계입니다. 실제 데이터 주소를 메모리에서 한 번 더 읽어 와 IR의 주소 부분을 바꿔 둡니다.
T0 : MAR ← IR(Addr)
T1 : MBR ← M[MAR]
T2 : IR(Addr) ← MBR비유하면 "냉장고 3번 칸에 있는 쪽지에 적힌 칸의 재료를 꺼내라"는 지시입니다. 쪽지를 먼저 읽어야 진짜 칸 번호를 알 수 있습니다.
실행 사이클 (Execute Cycle)
해독한 명령어를 실제로 수행하는 단계입니다. 필요한 데이터를 메모리에서 MBR로 가져와 ALU에서 연산합니다.
- 연산 결과는 보통 CPU 안의 레지스터(AC 등) 에 저장됩니다.
- 결과가 메모리에 저장되는 것은 STA(저장) 같은 저장 명령어일 때이고, 이때는 결과가 MBR을 거쳐 메모리로 들어갑니다.
- JUMP 같은 분기 명령어는 계산 대신 PC 값을 바꿔서, 다음에 인출할 명령어의 위치를 바꿉니다.
명령어별(ADD, LOAD, STA, JUMP) 실행 단계는 CPU 작동 원리의 "실행 사이클" 부분에 정리되어 있습니다.
인터럽트 사이클 (Interrupt Cycle)
실행 사이클이 끝난 뒤, 그 사이에 키보드 입력이나 타이머 같은 인터럽트 요청이 있었는지 확인합니다.
- 요청이 없으면 바로 다음 명령어의 인출 사이클로 갑니다.
- 요청이 있으면 지금 PC 값(돌아올 위치)을 안전한 곳(스택 등)에 저장하고, PC를 인터럽트 처리 루틴의 시작 주소로 바꿉니다. 처리가 끝나면 저장해 둔 PC 값을 되돌려 원래 하던 일을 이어 갑니다.
T0 : MBR ← PC
T1 : MAR ← 저장할 위치, PC ← 인터럽트 처리 루틴 주소
T2 : M[MAR] ← MBR인터럽트가 무엇이고 운영체제가 어떻게 처리하는지는 인터럽트에서 다룹니다.
더 알아보기: 파이프라인
요즘 CPU는 명령어 하나의 사이클이 완전히 끝나기를 기다리지 않습니다. 세탁기가 돌아가는 동안 건조기에 이전 빨래를 넣듯이, 명령어 1을 실행하는 동안 명령어 2를 해독하고 명령어 3을 인출합니다. 이것을 파이프라인(Pipeline) 이라고 합니다.
시간 → 1 2 3 4 5
명령어 1 인출 해독 실행
명령어 2 인출 해독 실행
명령어 3 인출 해독 실행명령어 하나에 걸리는 시간은 같아도, 일정 시간 동안 끝내는 명령어 수가 늘어납니다.
실제 CPU는 단계를 더 잘게 나눕니다. 아래 그림은 교과서에 자주 나오는 5단계 파이프라인입니다. IF(인출), ID(해독), EX(실행), MEM(메모리 접근), WB(결과를 레지스터에 쓰기) 순서로 진행되고, 초록색으로 칠한 시점에는 명령어 다섯 개가 각자 다른 단계를 동시에 처리하고 있습니다.

그림 출처: Wikimedia Commons (CC BY-SA 3.0)
정리
| 개념 | 비전공자 버전 요약 |
|---|---|
| 명령어 사이클 | 명령어 하나를 꺼내 실행하기까지의 단계. 계속 반복됨 |
| 인출 | 책갈피(PC)가 가리키는 명령어를 IR로 가져오고 책갈피를 다음 줄로 옮김 |
| 해독 | 제어장치가 명령어 뜻을 알아내고 각 장치에 보낼 신호를 만듦 |
| 간접 | 주소가 적힌 쪽지를 한 번 더 읽어 진짜 주소를 알아냄 |
| 실행 | ALU가 계산하고 결과를 보통 레지스터에 담음 |
| 인터럽트 | 급한 요청이 있었으면 하던 위치를 저장하고 처리하러 감 |
| 파이프라인 | 여러 명령어의 단계를 겹쳐서 동시에 진행 |
