한양과학기술고등학교

에듀테크 프로젝트 대시보드

CPU 구성요소 & 명령어 사이클

CPU 구성요소 & 명령어 사이클

컴퓨터 구조를 배우는 가장 첫걸음 — CPU 안에는 무엇이 있고, 프로그램 한 줄은 어떤 과정을 거쳐 실제로 "실행"되는가.

"프로그램이 실행된다"는 게 정확히 무슨 뜻일까? 화면에 결과가 뜨기까지 CPU는 메모리에서 명령어를 하나씩 읽어와 뜻을 해석하고, 그대로 실행하는 일을 아주 빠르게 반복할 뿐이다. 이 반복 단위를 명령어 사이클(Instruction Cycle)이라 하고, 그 사이클을 도는 하드웨어 부품들이 바로 CPU의 4대 구성요소다. 이 페이지에서 그 둘을 직접 눈으로 확인해 보자.

1. CPU 안에는 무엇이 있을까 — 4대 구성요소

CPU(중앙처리장치) 내부는 역할이 뚜렷이 다른 부품 몇 개로 나뉜다. 아래 다이어그램의 점선 상자가 CPU 하나다.

CPU
제어장치Control Unit
ALU산술논리연산장치
레지스터Register
버스 (Bus) — 주소·데이터·제어 신호가 오가는 통로자세한 구조는 아래 "버스 구조" 페이지에서
구성요소역할
제어장치
Control Unit
메모리에서 가져온 명령어를 해석하고, "지금 무엇을 해야 하는가"를 다른 부품들에게 신호로 지시하는 지휘자. 실제 계산은 하지 않는다.
ALU
산술논리연산장치
덧셈·뺄셈 같은 산술 연산과 AND·OR·비교 같은 논리 연산을 실제로 수행하는 계산기 부품.
레지스터
Register
CPU 내부에 있는 아주 작지만 초고속인 임시 저장소. 프로그램 카운터(PC)·명령어 레지스터(IR)처럼 사이클 진행용 특수 레지스터와, 계산에 쓰는 범용 레지스터(R1, R2…)가 있다.
버스
Bus
부품들 사이, 그리고 CPU와 메모리 사이에 주소·데이터·제어 신호를 실어 나르는 통로. 구조는 버스 구조 페이지에서 자세히.

2. 명령어 사이클 — Fetch → Decode → Execute

CPU는 이 네 부품을 이용해서 메모리에 저장된 명령어를 한 개씩 처리한다. 그 처리 과정은 항상 같은 세 단계를 거친다.

Fetch (인출) — 프로그램 카운터(PC)가 가리키는 메모리 주소에서 명령어를 읽어와 명령어 레지스터(IR)에 담는다. 그리고 PC는 다음 명령어를 가리키도록 +1 된다.
Decode (해독) — 제어장치가 IR에 담긴 명령어를 해석해서 "어떤 연산인지", "어떤 레지스터·주소를 쓰는지"를 알아낸다.
Execute (실행) — 실제 연산(ALU) 또는 메모리 쓰기(Store)가 일어난다. 계산 결과는 레지스터나 메모리에 저장된다.

🧪 미니 CPU 시뮬레이터 — 아래 4줄짜리 프로그램을 한 단계씩 직접 실행해 보자

대기 "다음 단계" 버튼을 눌러 Fetch 단계부터 시작해 보자.
CPU
제어장치
레지스터
PC · IR · R1~R3
ALU
메모리(명령어 + 데이터)
PC
0
IR
-
R1
0
R2
0
R3
0
명령어 메모리 (주소 0~3) — PC가 가리키는 칸이 파랗게 표시된다
데이터 메모리 (주소 10) — STORE가 실행되면 초록으로 표시된다
// 실행 대기 중...

3. 클럭(Clock)과의 관계

Fetch·Decode·Execute 각 단계는 아무 때나 일어나지 않는다. CPU 안의 클럭(Clock)이 규칙적인 "똑딱" 신호를 보내고, 그 박자에 맞춰 레지스터 값이 갱신되고 다음 단계로 넘어간다. 클럭이 빠를수록(클럭 속도, GHz) 이론상 사이클이 더 자주 도는 셈이지만, 사이클 하나에 여러 클럭이 필요하거나 코어 개수·병렬화 효율에 따라 실제 체감 성능은 달라진다. 이 계산은 암달의 법칙 페이지에서 다룬다.

4. 왜 이게 중요한가

결국 "프로그램이 실행된다"는 것은 이 Fetch → Decode → Execute 사이클이 메모리 끝에 다다를 때까지, 또는 프로그램이 끝날 때까지 수백만·수십억 번 반복되는 것뿐이다. 이 단순한 반복 위에 우리가 아는 모든 소프트웨어가 돌아간다.

그런데 한 사이클이 끝나야 다음 사이클의 Fetch가 시작되는 이 순차 방식은 한 순간에 하드웨어의 일부만 쓰고 나머지는 놀게 만든다. 파이프라이닝은 이 사이클들을 시간차를 두고 겹쳐 실행해서 놀고 있는 부품이 없도록 만드는 기법이다. 한편 LOAD R1, 5 같은 명령어 자체를 어떤 형태로, 얼마나 단순하게 또는 복잡하게 설계할지는 명령어 집합 구조(RISC vs CISC)에서 다루는 주제다. 지금 이 페이지에서 본 사이클이 그 두 이야기의 출발점이다.

코드로 보는 미니 CPU

위 시뮬레이터와 똑같은 동작을 하는 아주 작은 가상 CPU를 파이썬으로 옮기면 이렇게 된다.

# 레지스터: 프로그램 카운터(pc)와 범용 레지스터
regs = {"pc": 0, "R1": 0, "R2": 0, "R3": 0}
memory = [
    ("LOAD", "R1", 5), ("LOAD", "R2", 3),
    ("ADD",  "R1", "R2"), ("STORE", "R1", 10),
]
data = {}

def step():
    # 1. Fetch: PC가 가리키는 명령어를 읽고 PC를 +1
    ir = memory[regs["pc"]]
    regs["pc"] += 1

    # 2. Decode: 연산자와 피연산자를 분리
    op, a, b = ir

    # 3. Execute: 실제 연산 수행
    if op == "LOAD":
        regs[a] = b
    elif op == "ADD":
        regs[a] = regs[a] + regs[b]
    elif op == "STORE":
        data[b] = regs[a]

while regs["pc"] < len(memory):
    step()   # Fetch-Decode-Execute 무한 반복 = 프로그램 실행
한 줄 정리 — CPU는 제어장치·ALU·레지스터·버스라는 몇 안 되는 부품으로, "메모리에서 명령어를 읽고(Fetch) 뜻을 해석하고(Decode) 실행한다(Execute)"는 단순한 사이클을 클럭 신호에 맞춰 끊임없이 반복할 뿐이며, 이 반복이 겹쳐 실행되면 파이프라이닝, 명령어 형태 자체가 달라지면 RISC/CISC가 된다.