컴퓨터 구조 운영체제 네트워크 자료구조 알고리즘 데이터베이스 내 학습
arch · 02

CPU 구성 요소

레지스터ALUCPU

CPU(Central Processing Unit)는 컴퓨터의 두뇌입니다. 크게 ALU(산술논리연산장치), CU(제어장치), 레지스터(Register) 세 가지로 구성되며, 이들이 협력해 명령어를 해석하고 연산을 수행합니다.

핵심 구성

ALU — 산술논리연산장치

덧셈·뺄셈·곱셈 등 산술 연산과 AND·OR·NOT 등 논리 연산을 수행합니다. CPU의 실제 계산을 담당하는 핵심 부품입니다.

핵심 구성

CU — 제어장치

명령어를 해석하고 CPU 각 부품에 제어 신호를 보냅니다. 전체 연산 흐름을 지휘하는 지휘자 역할입니다.

핵심 구성

레지스터

CPU 내부의 초고속 임시 저장 공간입니다. PC, IR, MAR, MDR, ACC 등 역할에 따라 구분됩니다.

핵심 구성

내부 버스

CPU 내부 구성 요소들 사이의 데이터 통로입니다. ALU, CU, 레지스터를 연결합니다.

PC (Program Counter) — 다음에 실행할 명령어의 메모리 주소를 저장합니다. 명령어 실행 후 자동으로 증가합니다.
IR (Instruction Register) — 현재 실행 중인 명령어를 저장합니다. CU가 이 명령어를 해석해 제어 신호를 생성합니다.
MAR (Memory Address Register) — 메모리에서 읽거나 쓸 주소를 임시 저장합니다. 주소 버스와 연결됩니다.
MDR (Memory Data Register) — 메모리에서 읽어온 데이터 또는 메모리에 쓸 데이터를 임시 저장합니다. 데이터 버스와 연결됩니다. MBR(Memory Buffer Register)이라고도 부르며 동일한 레지스터입니다.
ACC (Accumulator) — ALU 연산 결과를 저장하는 레지스터입니다. 연산의 중간 결과를 누적합니다.

교재의 CPU와 실제 CPU

이 페이지의 PC, IR, MAR, MDR, ACC는 CPU가 명령어를 처리하는 과정을 설명하기 위해 교재에서 쓰는 단순 모델입니다. 실제 CPU는 여기에 캐시, 분기 예측기, 메모리 관리 장치 같은 부품을 더 갖추고 있고 레지스터의 이름과 개수도 구조마다 다릅니다. 모델을 이해해 두면 실제 CPU의 문서를 읽을 때 어떤 부품이 이 모델의 어느 역할에 해당하는지 짚을 수 있습니다.

자주 하는 오해

레지스터는 캐시의 다른 이름이다 — 레지스터는 명령어가 이름으로 직접 지정하는 CPU의 저장 공간이라 프로그래머(컴파일러)가 보는 구조의 일부입니다. 캐시는 하드웨어가 자동으로 관리하며 프로그램에는 드러나지 않는 저장소입니다.
PC·IR·MAR·MDR·ACC는 모든 CPU에 이 이름으로 있다 — 실제 구조마다 다릅니다. x86-64에서 다음 명령어 주소를 가리키는 레지스터는 RIP이고, 연산에는 범용 레지스터 16개(RAX, RBX … R15)를 씁니다. 누산기 하나를 중심으로 연산하는 설계는 6502 같은 초기 8비트 CPU에서 볼 수 있습니다.
ALU가 곧 CPU다 — ALU는 계산만 합니다. 무엇을 계산할지 정하고 데이터를 옮기는 신호는 CU가 만들고, 값은 레지스터가 붙잡고 있습니다. 세 부품이 함께 있어야 명령어 하나가 처리됩니다.
연산의 결과는 값 하나뿐이다 — 연산이 끝나면 결과의 성질(0인가, 음수인가, 자리올림이 있었나, 범위를 넘쳤나)도 상태 레지스터의 플래그로 기록됩니다. x86-64에서는 RFLAGS의 ZF, SF, CF, OF 등이며, x86 같은 구조의 조건 분기는 이 플래그를 보고 갈립니다.
제어 장치는 모두 같은 방식으로 만든다 — 제어 신호를 논리 회로로 직접 만드는 하드와이어드 방식과, 저장된 마이크로프로그램(마이크로명령어)을 실행해 만드는 마이크로프로그램 방식이 있습니다. 전자는 빠르고 후자는 바꾸기 쉽습니다. 일반적으로 명령어가 단순한 RISC 계열은 전자를, 복잡한 명령어가 많은 CISC 계열은 후자를 많이 활용합니다.

면접에서 이렇게 물어요

면접 질문

PC와 IR의 차이는 무엇인가요?

PC는 다음에 실행할 명령어의 주소를 담고, IR은 지금 실행 중인 명령어 자체를 담습니다. Fetch 단계에서 PC가 가리키는 주소의 명령어를 IR로 가져오고 PC는 다음 명령어를 가리키도록 바뀝니다.

면접 질문

레지스터와 메모리(RAM)는 어떻게 다른가요?

레지스터는 CPU 내부에 있어 훨씬 빠르지만 개수가 수십 개 수준으로 적고, 명령어에서 이름으로 지정합니다. 메모리는 CPU 바깥에 있어 용량이 크고 주소로 접근하며 상대적으로 느립니다.

면접 질문

MAR과 MDR은 왜 필요한가요?

교재 모델에서 CPU 내부 버스와 메모리 쪽 버스를 이어 주는 인터페이스 레지스터입니다. 접근할 주소를 MAR에, 주고받을 데이터를 MDR에 잡아 두고 메모리와 통신합니다.

면접 질문

하드와이어드와 마이크로프로그램 제어 장치는 무엇이 다른가요?

하드와이어드는 논리 회로로 제어 신호를 만들어 빠르지만 명령어를 바꾸려면 회로를 고쳐야 하고, 마이크로프로그램은 제어 기억장치의 마이크로명령어를 실행해 신호를 만들기 때문에 유연하지만 한 단계가 더 듭니다.

실제 시스템에서는

x86-64 — Intel 64 소프트웨어 개발자 매뉴얼은 64비트 모드에서 RIP가 다음 명령어의 주소를 담고, 범용 레지스터가 16개이며, 상태 플래그가 RFLAGS에 있다고 정의합니다.
소프트웨어에서 보이는 것 — 컴파일러는 자주 쓰는 변수를 가능한 한 레지스터에 두도록 코드를 만듭니다. 레지스터 수가 한정돼 있어 넘치는 값은 메모리(스택)로 내보내는데, 이를 레지스터 스필(spill)이라고 부릅니다.

함께 보면 좋은 토픽

명령어 사이클 — 명령어 사이클 — PC, MAR, MDR, IR이 인출·해독·실행 단계에서 어떻게 쓰이는지 봅니다.
폰 노이만 구조 — 폰 노이만 구조 — CPU가 놓인 컴퓨터 전체 구성과 병목을 봅니다.
파이프라이닝 — 파이프라이닝 — 이 부품들을 겹쳐 써서 처리량을 높이는 방법입니다.
버스 구조 — 버스 구조 — MAR·MDR이 연결되는 주소·데이터·제어 버스를 봅니다.
RISC vs CISC — CPU가 이해하는 명령어 집합(ISA)을 설계하는 두 접근을 비교합니다.

참고 자료

C — CPU 구성 요소 구조체 시뮬레이션

// CPU 내부 레지스터 구조체
typedef struct {
    unsigned int PC;   // Program Counter  — 다음 명령어 주소
    unsigned int IR;   // Instruction Reg  — 현재 명령어
    unsigned int MAR;  // Memory Addr Reg  — 메모리 접근 주소
    unsigned int MDR;  // Memory Data Reg  — 메모리 데이터 버퍼
    unsigned int ACC;  // Accumulator      — ALU 연산 결과
} Registers;

// ALU — 산술논리연산장치
unsigned int alu_execute(unsigned int op,
                          unsigned int a,
                          unsigned int b) {
    switch (op) {
        case 0x01: return a + b;   // ADD
        case 0x02: return a - b;   // SUB
        case 0x03: return a & b;   // AND
        case 0x04: return a | b;   // OR
        case 0x05: return ~a;      // NOT
        default:   return 0;
    }
}

// CU — 제어장치: 명령어 해석 후 제어 신호 생성
void cu_decode(Registers *reg, unsigned int *memory) {
    unsigned int opcode  = (reg->IR >> 24) & 0xFF;
    unsigned int operand =  reg->IR & 0xFFFFFF;

    switch (opcode) {
        case 0x01:  // LOAD — 메모리 → ACC
            reg->MAR = operand;
            reg->MDR = memory[reg->MAR];
            reg->ACC = reg->MDR;
            break;
        case 0x02:  // STORE — ACC → 메모리
            reg->MAR = operand;
            reg->MDR = reg->ACC;
            memory[reg->MAR] = reg->MDR;
            break;
        case 0x03:  // ADD — ACC + 메모리값
            reg->MAR = operand;
            reg->MDR = memory[reg->MAR];
            reg->ACC = alu_execute(0x01, reg->ACC, reg->MDR);
            break;
    }
    reg->PC++;
}

CU가 IR에 담긴 명령어를 해석해 MAR→MDR→ACC 순서로 데이터를 이동시킵니다. ALU는 CU의 제어 신호를 받아 실제 연산을 수행합니다.

Java — 레지스터 역할 시뮬레이션

// 간단한 CPU 레지스터 동작 시뮬레이터
public class SimpleCPU {

    private int PC  = 0;   // Program Counter
    private int IR  = 0;   // Instruction Register
    private int MAR = 0;   // Memory Address Register
    private int MDR = 0;   // Memory Data Register
    private int ACC = 0;   // Accumulator
    private int[] memory;

    public SimpleCPU(int[] program) {
        this.memory = program;
    }

    public void step() {
        // FETCH: PC → MAR → MDR → IR
        MAR = PC;
        MDR = memory[MAR];
        IR  = MDR;
        PC++;

        // DECODE & EXECUTE
        int opcode  = (IR >> 16) & 0xFF;
        int operand =  IR & 0xFFFF;

        switch (opcode) {
            case 1 -> ACC = memory[operand];         // LOAD
            case 2 -> memory[operand] = ACC;         // STORE
            case 3 -> ACC += memory[operand];        // ADD
            case 4 -> ACC -= memory[operand];        // SUB
        }
    }
}

FETCH 단계에서 PC → MAR → MDR → IR 순서로 명령어가 이동합니다. 각 레지스터의 역할이 명확히 구분되어 있으며, CU는 IR을 해석해 ALU와 메모리를 제어합니다.

Q1

ALU(산술논리연산장치)의 역할은?

덧셈, 뺄셈, AND, OR 같은 연산을 담당합니다.
ALU는 CU(제어장치)의 지시에 따라 실제 산술·논리 연산을 수행하는 CPU의 핵심 실행 단위입니다.

Q2

제어장치(CU)의 역할로 가장 적절한 것은?

오케스트라의 지휘자 역할과 비슷합니다.
CU는 명령어를 해석하고 ALU, 레지스터, 메모리 등에 제어 신호를 보내 명령어가 올바른 순서로 실행되도록 지휘합니다.

Q3

레지스터가 캐시나 메모리보다 빠른 이유는?

메모리 계층에서 CPU와 가장 가까운 저장장치입니다.
레지스터는 CPU 내부 회로에 직접 위치해 접근 지연이 거의 없습니다. 대신 용량이 매우 작다는 트레이드오프가 있습니다.