CPU 명령어 사이클: 인출부터 인터럽트 처리까지

CPU 명령어 사이클의 Fetch·Decode·Execute 흐름과 메모리 접근, Write Back, 인터럽트, 파이프라인 및 CPI의 관계를 정리한다.

2026-08-14 · 최초 발행 2026-01-03

CPU 실행은 명령어 사이클의 반복으로 이루어진다

명령어 사이클(Instruction Cycle)은 CPU가 메모리에서 명령어를 가져온 뒤 의미를 해석하고 실행하는 처리 단위다. 프로그램 실행은 이 사이클이 연속해서 반복되는 과정이며, 가장 단순하게는 Fetch, Decode, Execute로 나눈다.

명령어에 메모리 읽기·쓰기와 결과 저장이 필요한 경우에는 Memory Access와 Write Back까지 포함한 확장 5단계 모델로 볼 수 있다. 각 단계 내부는 다시 레지스터 전송과 제어 신호로 구성된 마이크로 오퍼레이션으로 분해된다.

다음 명령어FetchDecodeExecuteMemoryWrite Back

명령어를 가져오고 해석하는 구간

Fetch Cycle은 Program Counter(PC)가 가리키는 주소에서 다음 명령어를 읽어 오는 단계다. Memory Address Register(MAR), Memory Buffer Register(MBR), Instruction Register(IR)가 이 과정에 관여한다.

  1. MAR ← PC (메모리 주소 레지스터에 PC 값 전송)
  2. MBR ← Memory[MAR] (메모리에서 명령어 읽기)
  3. IR ← MBR (명령어 레지스터에 저장)
  4. PC ← PC + 1 (다음 명령어 주소로 이동)

PC는 다음에 실행할 명령어의 주소를 유지하고, MAR은 접근할 메모리 주소를 담는다. MBR은 메모리 데이터의 전달 경로이며, IR에는 현재 처리 중인 명령어가 저장된다.

주소명령어PC + 1PCMARMemoryMBRIR다음 주소

Decode Cycle에서는 IR에 들어온 명령어의 Opcode를 분석하고 Operand를 추출한다. 이때 주소지정방식을 판별하고 피연산자가 레지스터에 있는지 메모리에 있는지 확인하며, 필요한 하드웨어를 구동할 제어 신호를 만든다.

명령어: ADD R1, R2, R3
Opcode: ADD
Operand: R1 (목적지), R2, R3 (소스)
의미: R1 = R2 + R3

실행 결과가 이동하는 경로

Execute Cycle은 ALU가 실제 연산을 수행하거나, 이동·분기처럼 실행 상태를 바꾸는 단계다. 산술 연산에는 ADD, SUB, MUL, DIV가 있고 논리 연산에는 AND, OR, XOR, NOT가 있다. MOV, LOAD, STORE는 레지스터와 메모리 사이의 이동을 처리하며, JMP, BEQ, BNE는 PC 값을 변경한다.

; ADD R1, R2, R3
1. R2와 R3 값을 ALU로 전송
2. ALU에서 덧셈 수행
3. 결과를 임시 레지스터에 저장
R2 + R3R2ALUR3결과임시레지스터

Memory Access Cycle은 Load와 Store 명령어에서 메모리를 읽거나 쓰는 구간이다. 연산 명령어는 이 단계를 건너뛴다.

Load에서는 주소를 계산한 후 MAR에 주소를 전달하고, 메모리에서 읽은 값을 MBR을 거쳐 레지스터에 넣는다. Store에서는 레지스터 값을 MBR에 옮긴 뒤 해당 주소의 메모리에 기록한다.

; LOAD R1, [0x1000]
1. MAR ← 0x1000
2. MBR ← Memory[0x1000]
3. R1 ← MBR

; STORE R2, [0x2000]
1. MAR ← 0x2000
2. MBR ← R2
3. Memory[0x2000] ← MBR

Write Back Cycle은 실행 결과를 목적 레지스터에 반영해 명령어 처리를 마치는 단계다. ADD처럼 ALU 결과가 있는 명령어는 임시 레지스터의 값을 목적 레지스터로 옮기고 레지스터 파일을 갱신한다.

; ADD R1, R2, R3
1. ALU 결과를 R1에 저장
2. 명령어 완료

Load 명령어에서는 MBR에 읽어 온 값을 목적 레지스터에 기록한다.

; LOAD R1, [0x1000]
1. MBR의 값을 R1에 저장
명령어싸이클(5단계)Fetch(IF)Decode(ID)Execute(EX)Memory(MEM)Write Back(WB)PC, MAR, MBR, IROpcode, OperandALU 연산Load/Store레지스터 저장

인터럽트가 실행 흐름에 끼어드는 방식

외부 이벤트가 발생하면 CPU는 Execute Cycle 뒤에 인터럽트 플래그를 확인하고, 필요하면 Interrupt Cycle로 전환한다. 현재 PC와 레지스터 등의 상태를 스택에 보관한 뒤 인터럽트 벡터 테이블에서 ISR 주소를 가져와 인터럽트 서비스 루틴을 실행한다. 처리가 끝나면 저장했던 상태를 복원하고 중단된 위치에서 프로그램을 재개한다.

인터럽트 있음인터럽트 없음Execute인터럽트확인현재 상태저장ISR 주소로드ISR실행상태복원프로그램재개다음 명령어Fetch

인터럽트는 발생 원인에 따라 외부 인터럽트, 내부 인터럽트(예외), 소프트웨어 인터럽트로 나뉜다. 외부 인터럽트에는 I/O 장치, 타이머, 전원 이상이 포함된다. 내부 인터럽트는 0으로 나누기, Overflow, Illegal Instruction 같은 예외에서 발생한다. System Call과 Trap은 소프트웨어 인터럽트에 해당한다.

ADD·LOAD·JMP에서 달라지는 단계

ADD R1, R2, R3은 R2와 R3의 합을 R1에 저장한다. Fetch에서는 명령어를 IR로 읽고 PC를 다음 주소로 이동시킨다. Decode에서는 ADD Opcode와 목적지·소스 피연산자를 해석해 제어 신호를 생성한다. Execute에서 ALU가 R2 + R3을 수행한 결과를 임시 레지스터에 저장하고, Memory Access는 메모리 접근이 필요 없으므로 건너뛴다. Write Back에서 R1 ← ALU 결과를 수행하면 명령어가 완료된다.

LOAD R1, [0x1000]은 Fetch와 Decode를 거친 뒤 Execute에서 주소 0x1000을 계산하고 MAR에 넣는다. Memory Access에서는 MBR ← Memory[0x1000]이 수행되며, Write Back에서 R1 ← MBR로 값을 기록한다.

JMP 0x2000은 Decode 뒤 Execute에서 PC ← 0x2000을 수행한다. 이후 명령어는 0x2000부터 인출된다. 메모리 접근과 레지스터 저장은 필요 없으므로 Memory Access와 Write Back을 건너뛴다.

파이프라인은 단계별 작업을 겹친다

명령어 사이클의 단계는 파이프라인 단계로도 사용된다. 서로 다른 명령어가 각 단계에 동시에 배치되므로 처리량이 증가한다. 5단계 파이프라인은 IF, ID, EX, MEM, WB의 흐름으로 표현할 수 있다.

Cycle 1: [IF: Inst1]
Cycle 2: [ID: Inst1][IF: Inst2]
Cycle 3: [EX: Inst1][ID: Inst2][IF: Inst3]
Cycle 4: [MEM: Inst1][EX: Inst2][ID: Inst3][IF: Inst4]
Cycle 5: [WB: Inst1][MEM: Inst2][EX: Inst1][ID: Inst3][IF: Inst4]

이상적으로는 5배 처리량 증가를 기대할 수 있지만, 실제 처리량 증가는 해저드로 인한 손실 때문에 3~4배다.

CPI(Cycles Per Instruction)는 명령어 하나를 완료하는 데 드는 사이클 수다. 비파이프라인 5단계 구조에서는 CPI = 5이고 한 명령어는 5 사이클에 완료된다. 이상적인 파이프라인 정상 상태에서는 CPI = 1이며, 실제 파이프라인에서는 해저드로 인한 스톨 때문에 CPI ≈ 1.2 ~ 1.5가 된다.

클럭 주기와 실행 시간의 관계

명령어 사이클은 여러 클럭 사이클로 구성된다. 예를 들어 3 GHz는 3,000,000,000 사이클/초이고, 1 사이클은 0.33 나노초다. Fetch는 12 클럭, Decode는 1 클럭, Execute는 명령어에 따라 110 클럭이 걸린다. Memory는 캐시 미스 시 1~수백 클럭이 걸릴 수 있고, Write Back은 1 클럭이다.

실행 시간 = 명령어 수 × CPI × 클럭 주기
실행 시간 = 명령어 수 × CPI / 클럭 주파수
명령어 수: 1,000,000
CPI: 1.5
클럭 주파수: 3 GHz

실행 시간 = 1,000,000 × 1.5 / 3,000,000,000
          = 0.5 밀리초

제어 신호로 쪼개 보는 마이크로 오퍼레이션

마이크로 오퍼레이션은 명령어 사이클의 각 단계를 더 작은 레지스터 전송 수준(RTL) 작업으로 나눈 것이다. 제어 유닛은 이 작업들의 순서를 제어하고 필요한 신호를 생성한다.

Fetch는 다음과 같은 타이밍 신호로 나눌 수 있다.

T0: MAR ← PC
T1: MBR ← Memory[MAR], PC ← PC + 1
T2: IR ← MBR

T0, T1, T2는 타이밍 신호이며, 각 타이밍에 하나의 마이크로 오퍼레이션이 배치된다. ADD 실행도 입력 전달, 연산, 결과 저장으로 분해된다.

T0: ALU_Input1 ← R2
T1: ALU_Input2 ← R3
T2: ALU_Result ← ALU_Input1 + ALU_Input2
T3: R1 ← ALU_Result

제어 유닛은 이 순서를 관리하고 제어 신호를 만든다. 구현 방식은 하드와이어드 제어와 마이크로프로그래밍으로 구분된다.

컴퓨터구조CPU명령어 사이클파이프라인인터럽트