CPU 구성 요소
CPU(Central Processing Unit)는 컴퓨터의 두뇌입니다. 크게 ALU(산술논리연산장치), CU(제어장치), 레지스터(Register) 세 가지로 구성되며, 이들이 협력해 명령어를 해석하고 연산을 수행합니다.
핵심 구성
ALU — 산술논리연산장치
덧셈·뺄셈·곱셈 등 산술 연산과 AND·OR·NOT 등 논리 연산을 수행합니다. CPU의 실제 계산을 담당하는 핵심 부품입니다.
핵심 구성
CU — 제어장치
명령어를 해석하고 CPU 각 부품에 제어 신호를 보냅니다. 전체 연산 흐름을 지휘하는 지휘자 역할입니다.
핵심 구성
레지스터
CPU 내부의 초고속 임시 저장 공간입니다. PC, IR, MAR, MDR, ACC 등 역할에 따라 구분됩니다.
핵심 구성
내부 버스
CPU 내부 구성 요소들 사이의 데이터 통로입니다. ALU, CU, 레지스터를 연결합니다.
교재의 CPU와 실제 CPU
이 페이지의 PC, IR, MAR, MDR, ACC는 CPU가 명령어를 처리하는 과정을 설명하기 위해 교재에서 쓰는 단순 모델입니다. 실제 CPU는 여기에 캐시, 분기 예측기, 메모리 관리 장치 같은 부품을 더 갖추고 있고 레지스터의 이름과 개수도 구조마다 다릅니다. 모델을 이해해 두면 실제 CPU의 문서를 읽을 때 어떤 부품이 이 모델의 어느 역할에 해당하는지 짚을 수 있습니다.
자주 하는 오해
면접에서 이렇게 물어요
면접 질문
PC와 IR의 차이는 무엇인가요?
PC는 다음에 실행할 명령어의 주소를 담고, IR은 지금 실행 중인 명령어 자체를 담습니다. Fetch 단계에서 PC가 가리키는 주소의 명령어를 IR로 가져오고 PC는 다음 명령어를 가리키도록 바뀝니다.
면접 질문
레지스터와 메모리(RAM)는 어떻게 다른가요?
레지스터는 CPU 내부에 있어 훨씬 빠르지만 개수가 수십 개 수준으로 적고, 명령어에서 이름으로 지정합니다. 메모리는 CPU 바깥에 있어 용량이 크고 주소로 접근하며 상대적으로 느립니다.
면접 질문
MAR과 MDR은 왜 필요한가요?
교재 모델에서 CPU 내부 버스와 메모리 쪽 버스를 이어 주는 인터페이스 레지스터입니다. 접근할 주소를 MAR에, 주고받을 데이터를 MDR에 잡아 두고 메모리와 통신합니다.
면접 질문
하드와이어드와 마이크로프로그램 제어 장치는 무엇이 다른가요?
하드와이어드는 논리 회로로 제어 신호를 만들어 빠르지만 명령어를 바꾸려면 회로를 고쳐야 하고, 마이크로프로그램은 제어 기억장치의 마이크로명령어를 실행해 신호를 만들기 때문에 유연하지만 한 단계가 더 듭니다.
실제 시스템에서는
함께 보면 좋은 토픽
참고 자료
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(산술논리연산장치)의 역할은?
Q2
제어장치(CU)의 역할로 가장 적절한 것은?
Q3
레지스터가 캐시나 메모리보다 빠른 이유는?