탐색으로 돌아가기
Hardware2 / 24 단계

CPU

중앙처리장치

모든 연산의 중심. 클럭에 맞춰 메모리에서 명령어를 가져오고(Fetch), 해석하고(Decode), 실행한다(Execute).

CPU(중앙처리장치)는 명령어를 인출(fetch)·해석(decode)·실행(execute)하는 폰 노이만 구조의 심장으로, 그 동작은 전적으로 내부 '레지스터(register)'라는 초고속 저장소들 사이의 데이터 이동으로 이루어진다. 페치 단계에서 프로그램 카운터(PC)가 가리키는 주소가 MAR(메모리 주소 레지스터)로 복사되어 주소 버스로 나가고, 해당 명령어가 데이터 버스를 통해 MDR(메모리 데이터 레지스터)로 들어온 뒤 명령어 레지스터(IR)에 적재되며 PC는 다음 명령어를 가리키도록 증가한다. 디코드 단계에서 제어장치(Control Unit)의 명령어 디코더가 IR의 비트필드를 해석해 '어떤 연산을, 어떤 레지스터·피연산자로' 수행할지 제어 신호(control signal)로 변환한다. 실행 단계에서는 ALU(산술논리장치)가 실제 덧셈·비교·논리연산을 수행하고 그 결과는 누산기(Accumulator)나 범용 레지스터에 저장되며, 연산의 부수 결과(제로·캐리·오버플로·부호)는 상태/플래그 레지스터(FLAGS)에 기록되어 조건 분기의 근거가 된다. 이 모든 흐름은 클럭에 맞춰 동기화되고, 자주 쓰는 데이터·명령어는 L1/L2 캐시가 붙잡아 두며, 현대 CPU는 파이프라인으로 여러 명령을 겹쳐 처리해 처리량을 극대화한다.

내부 구성

프로그램 카운터 (Program Counter, PC / IP)
다음에 인출할 명령어의 메모리 주소를 저장. 인출 후 자동 증가하거나 분기 시 목표 주소로 갱신됨
명령어 레지스터 (Instruction Register, IR)
현재 인출되어 디코딩·실행 중인 명령어 비트열을 보관하는 레지스터
누산기 (Accumulator, ACC)
ALU 연산의 한쪽 피연산자와 결과를 임시로 담는 전용 레지스터(단순 구조 CPU의 연산 중심)
범용 레지스터 파일 (General-Purpose Register File)
EAX/RAX, R0~R31 등 여러 개의 범용 레지스터 묶음. 피연산자·중간 결과·주소를 담아 메모리 접근을 최소화
상태/플래그 레지스터 (Status/FLAGS Register)
직전 연산의 Zero·Carry·Overflow·Sign 등 상태 비트를 보관해 조건 분기·오버플로 검출에 사용
메모리 주소 레지스터 (Memory Address Register, MAR)
CPU가 접근하려는 메모리 주소를 담아 주소 버스로 내보내는 레지스터
메모리 데이터 레지스터 (Memory Data Register, MDR/MBR)
메모리와 CPU 사이를 오가는 데이터·명령어를 임시로 담는 데이터 버스 창구 레지스터
산술논리장치 (Arithmetic Logic Unit, ALU)
덧셈·뺄셈·AND/OR/NOT·시프트·비교 등 실제 산술·논리 연산을 수행하는 연산 코어
제어장치 (Control Unit, CU)
명령을 해석해 데이터패스의 각 부품에 언제 무엇을 하라는 제어 신호를 생성·조율. 하드와이어드 또는 마이크로코드 방식
명령어 디코더 (Instruction Decoder)
IR의 opcode/피연산자 비트필드를 해독해 어떤 연산·레지스터·주소지정을 쓸지 결정 (x86은 μop으로 분해)
L1/L2 캐시 (On-chip Cache)
L1은 명령(I-cache)·데이터(D-cache)로 분리된 코어 전용 초고속 캐시, L2는 통합·코어 전용으로 L1 미스를 흡수
클럭 (Clock)
일정 주기의 펄스로 모든 레지스터 전이와 파이프라인 단계를 동기화하는 박자기(GHz 단위)
버스 (Bus: 주소/데이터/제어)
주소 버스(어디를), 데이터 버스(무엇을), 제어 버스(읽기/쓰기 등 방향·타이밍)로 구성원 간 통신을 담당
파이프라인 (Pipeline)
Fetch/Decode/Execute/Memory/Write-back 단계를 겹쳐 실행해 클럭당 명령 처리량(throughput)을 높이는 구조

핵심 포인트

  • PC(프로그램 카운터)는 다음에 실행할 명령어의 주소를 보관하고, 명령 인출 후 자동 증가함
  • MAR→주소 버스로 주소 송출, MDR←데이터 버스로 명령/데이터 수신 — 메모리와의 유일한 창구
  • IR(명령어 레지스터)에 담긴 명령을 제어장치의 디코더가 해석해 제어 신호를 생성
  • ALU가 산술·논리 연산을 수행하고 결과는 누산기/범용 레지스터에, 부수 결과는 FLAGS에 기록
  • FLAGS(상태 레지스터)의 Zero/Carry/Overflow/Sign 비트가 조건 분기(if, 반복)의 판단 근거
  • 레지스터가 메모리 계층의 최상단(1클럭)이며, L1(명령/데이터 분리)·L2 캐시가 그 아래에서 지연을 은폐
  • 파이프라인(Fetch/Decode/Execute/Memory/Write-back)으로 명령을 겹쳐 처리해 처리량 향상, 슈퍼스칼라는 병렬 실행

심화

면접에서 '레지스터, 캐시, RAM의 차이'와 '왜 레지스터가 이렇게 많이 필요한가'는 단골 질문이다. 레지스터는 ALU 바로 옆에 있어 1클럭에 접근되는 CPU 내부 저장소로, C 컴파일러가 지역 변수와 중간 계산 결과를 레지스터에 배정(register allocation)해 메모리 왕복을 없애는 것이 최적화의 핵심이다. MAR/MDR을 명시적으로 이해하면 'CPU가 메모리를 어떻게 읽고 쓰는가'라는 질문에 정확히 답할 수 있는데, 주소는 항상 MAR을 거쳐 주소 버스로, 데이터는 항상 MDR을 거쳐 데이터 버스로 오간다는 것이 폰 노이만 병목(von Neumann bottleneck)의 물리적 실체다. 하버드 구조가 명령·데이터 버스를 분리하고, 현대 CPU가 L1을 I-cache와 D-cache로 나누는 것도 이 병목을 완화하려는 설계다. 한 단계 더 들어가면, 현대 x86 CPU는 겉으로 CISC 명령어를 받지만 내부적으로 디코더가 이를 RISC 형태의 마이크로연산(μop)으로 쪼개 파이프라인에 흘려보낸다. 여기에 파이프라인의 '해저드(hazard)'라는 개념이 붙는데, 분기 명령의 결과가 확정되기 전에 다음 명령을 미리 가져와야 하므로 분기 예측(branch prediction)이 필요하고, 예측이 빗나가면 파이프라인을 비우는(flush) 페널티가 발생한다. 또한 슈퍼스칼라(superscalar)와 비순차 실행(out-of-order execution)은 여러 실행 유닛에 명령을 동시에 흘려 IPC(클럭당 명령 수)를 1 이상으로 끌어올린다. FLAGS 레지스터를 조건 분기와 연결해 설명하고, 분기 예측 실패 비용까지 말할 수 있으면 CPU 파트에서 깊이를 인정받는다.

쉽게 말하면 요리사가 레시피(명령어)를 한 줄씩 읽고 → 이해하고 → 조리하는 과정을 초고속으로 반복.

면접 예상 질문

#Fetch#Decode#Execute#ALU#레지스터#클럭