컴퓨터 구조를 공부할 때 CPU와 레지스터는 항상 같이 언급된다. 하지만 막상 설명하려고 하면 “중앙처리장치가 연산하고 레지스터는 저장한다” 정도로만 기억나고 이 둘이 어떻게 협력하는지 흐름이 잘 그려지지 않았다. 이번 TIL에서는 이 두 요소의 개념과 역할 그리고 그 상호작용을 정리해본다.
CPU(Central Processing Unit)는 컴퓨터의 두뇌 역할을 한다. 프로그램의 명령어를 해석하고 실행하는 가장 핵심적인 연산 장치다.
구성 요소 | 설명 |
---|---|
CU (제어장치) | 명령어를 해석하고 흐름 제어 |
ALU (산술논리연산장치) | 덧셈, 뺄셈 등 연산 수행 |
레지스터 | CPU 내부의 초고속 임시 저장소 |
캐시 | 자주 쓰는 데이터를 임시 저장하는 공간 |
레지스터(Register)는 CPU 내부에 내장된 초고속 기억장치이다.
RAM보다 훨씬 빠르고 용량은 적지만 명령어 실행에 필요한 데이터를 아주 빠르게 읽고 쓸 수 있다.
CPU 내부의 레지스터는 용도에 따라 여러 종류로 나뉘며 각각 고유한 기능을 수행한다. 대표적인 레지스터는 다음과 같다.
레지스터 | 이름 (약어) | 역할 |
---|---|---|
프로그램 카운터 | PC (Program Counter) | 다음에 실행할 명령어의 주소를 저장 |
명령어 레지스터 | IR (Instruction Register) | 현재 실행 중인 명령어를 저장 |
누산기 | ACC (Accumulator) | 연산 결과를 저장하는 범용 레지스터 |
스택 포인터 | SP (Stack Pointer) | 스택의 최상단 주소를 저장. 함수 호출/리턴 시 활용 |
상태 레지스터 / 플래그 레지스터 | PSW (Program Status Word) 또는 FLAGS | 연산 결과에 따른 상태(Zero, Carry, Overflow 등)를 저장 |
범용 레지스터 | R0 ~ Rn | 덧셈, 뺄셈 등 연산에 필요한 값을 임시 저장 (예: RAX, RBX 등) |
x86 아키텍처에서 두 값을 더하는 예를 보자.
RAX와 RBX는 범용 레지스터로 각각의 값은 CPU 내부에 저장되어 있다.
ADD RAX, RBX ; RAX = RAX + RBX
이 명령어는 RBX 레지스터의 값을 RAX에 더하고 결과를 다시 RAX에 저장한다. 연산은 ALU에서 수행되고 레지스터 간 데이터 이동과 저장은 CPU 내부 버스를 통해 이루어진다. 결과적으로 이 연산은 모두 레지스터 안에서만 처리되기 때문에 매우 빠르다. 이처럼 레지스터는 연산 대상이자 결과 저장소로 직접 사용되며 CPU 성능에 큰 영향을 미친다.
간단히 말하면 CPU는 연산하고 레지스터는 그 과정에 필요한 데이터를 잠깐 보관한다.
이미지 출처: https://i1hwan.com/cs-intro-data-manipulation/
1. PC가 다음 명령어의 주소를 가리킴
2. CU가 해당 주소의 명령어를 메모리에서 읽어와 IR에 저장
3. 명령어 실행: 연산에 필요한 값은 범용 레지스터(R1, R2 등)에 저장되어 있음
4. ALU가 연산 수행 후 결과를 ACC에 저장
5. 조건에 따라 FLAGS가 상태 기록 (예: 결과가 0이면 Zero 플래그 세팅)
6. 함수 호출 시 SP가 스택에 현재 위치 저장
이처럼 레지스터는 단순한 저장소 그 이상으로 명령어 처리 흐름 전체에서 중요한 역할을 수행한다. 특히 명령어를 꺼내는(fetch), 해석하는(decode), 실행하는(execute) 과정에서 레지스터 간 정보 전달이 핵심이다.
항목 | 레지스터 | 메모리(RAM) |
---|---|---|
위치 | CPU 내부 | CPU 외부 |
속도 | 매우 빠름 | 느림 (수십 배) |
용량 | 매우 작음 | 수 GB 이상 |
역할 | 즉시 사용 데이터 저장 | 대용량 일반 데이터 저장 |
메모리는 책장, 레지스터는 손에 들고 있는 종이 쪽지에 비유할 수 있다. 즉, 자주 쓰는 데이터일수록 레지스터에 두고 덜 자주 쓰는 데이터는 메모리에 둔다고 이해하면 쉽다.
CPU와 레지스터의 관계를 보다 구체적으로 이해할 수 있었다. 단순히 "레지스터는 빠른 저장소"라고만 알고 있었던 개념에서 벗어나 레지스터가 명령어 수행의 핵심적인 연결고리라는 점을 알게 되었다. 특히 명령어를 가져오는 과정(PC -> IR), 연산 수행(범용 레지스터 -> ALU -> ACC), 조건 판별(FLAGS), 함수 호출/복귀(SP)까지 모든 흐름에서 레지스터가 중요한 역할을 수행한다는 것이 인상 깊었다.
또한, CPU 내부 구성 요소 간 협업 구조를 그림과 예시를 통해 직관적으로 파악할 수 있었고, 메모리(RAM)와의 차이점도 '손에 들고 있는 쪽지 vs 책장'이라는 비유로 쉽게 이해할 수 있었다. 앞으로 어셈블리어나 시스템 프로그래밍을 공부할 때 이런 레지스터 구조를 이해하고 있으면 코드 흐름이 더 잘 보일 것 같다.
참고