⚡ CPU는 어떻게 그렇게 빠를까?
— 레지스터(Register) 완전 정복
핵심 요약: CPU가 연산할 때 매번 RAM에서 데이터를 가져오면 너무 느리다.
그래서 CPU 내부에 초고속 임시 저장 공간을 두었는데, 그것이 바로 레지스터(Register) 다.
1️⃣ 레지스터란?
레지스터는 CPU 칩 내부에 설계된 가장 빠른 소규모 저장 공간이다.
- 물리적 위치: CPU 칩 내부에 직접 설계
- 속도: L1 캐시보다도 수십 배 빠름
- 용량: CPU 비트 수(32bit / 64bit)에 맞는 워드(Word) 단위, 수십 개 수준
💡 왜 레지스터 수와 용량을 늘리지 않을까?
레지스터는 CPU 다이(Die) 위에 직접 새겨지는 회로다. 개수가 늘수록 칩 면적, 발열, 전력 소비가 기하급수적으로 증가한다. 그래서 "소수의 초고속" 전략을 유지한다.
2️⃣ 왜 레지스터가 필요한가? — 메모리 계층 구조
CPU 연산 속도와 RAM 접근 속도 사이에는 엄청난 격차가 있다.
CPU 연산: 1 나노초 (0.000000001초)
RAM 접근: 약 100 나노초 → CPU 입장에서 100배나 기다려야 함
이 병목을 해결하기 위해 계층형 저장 구조를 사용한다.
도서관 비유로 이해하기
| 저장소 | 비유 | 특징 |
|---|---|---|
| 레지스터 | 내 손의 메모지 | 즉시 참조 가능 |
| 캐시 | 내 책상 위 책 | 자주 쓰는 것 미리 꺼내둠 |
| RAM | 내 방 책장 | 필요할 때 꺼내야 함 |
| HDD | 도서관 | 멀리 가야 해서 느림 |
3️⃣ 주요 레지스터의 종류
CPU 내부에는 역할에 따라 다양한 레지스터가 존재한다.
| 레지스터 | 이름 | 역할 |
|---|---|---|
| PC (Program Counter) | 프로그램 카운터 | 다음에 실행할 명령어의 메모리 주소를 가리킴 |
| IR (Instruction Register) | 명령어 레지스터 | 현재 실행 중인 명령어를 저장 |
| MAR (Memory Address Register) | 메모리 주소 레지스터 | 읽거나 쓸 데이터의 메모리 주소 저장 |
| MBR (Memory Buffer Register) | 메모리 버퍼 레지스터 | 메모리에서 읽어온 데이터 또는 쓸 데이터 임시 저장 |
| AC (Accumulator) | 누산기 | 연산의 중간/최종 결과 임시 저장 |
🔄 명령어 실행 사이클과 레지스터
CPU가 명령어 하나를 실행하는 과정에서 레지스터들이 어떻게 협력하는지 보자.
① PC → 다음 실행할 명령어 주소 확인
② MAR ← PC의 주소값 복사
③ RAM → MBR로 해당 주소의 명령어 로드
④ IR ← MBR의 명령어 저장
⑤ PC → 다음 주소로 증가 (PC++)
⑥ AC ← 연산 수행 후 결과 저장
⑦ 반복
4️⃣ Java 개발자 관점 — JVM과 레지스터
Java는 스택 기반(Stack-based) 가상 머신이라 개발자가 레지스터를 직접 건드리지 않는다.
그러나 JVM 내부에서 레지스터 개념은 핵심적으로 사용된다.
📌 JVM PC Register
Java의 모든 스레드는 고유한 PC Register를 가진다.
// 멀티스레드 환경에서 스레드 전환이 일어날 때
Thread A 실행 중 → PC: 0x0042 (현재 bytecode 위치)
→ 스레드 전환 (Context Switch)
Thread B 실행
→ 다시 Thread A로 복귀
Thread A PC: 0x0042 → 정확히 이어서 실행 ✅
PC Register가 없다면 스레드가 전환되었다가 돌아왔을 때 어디까지 실행했는지 알 수 없다.
⚡ JIT 컴파일러의 레지스터 최적화
Java 코드는 처음엔 바이트코드로 실행되지만, JIT(Just-In-Time) 컴파일러가 자주 실행되는 코드를 기계어로 변환할 때 핵심 최적화를 적용한다.
// 개발자가 작성한 코드
int sum = 0;
for (int i = 0; i < 1000000; i++) {
sum += i;
}
JIT 컴파일러가 하는 일:
① sum, i 변수를 RAM이 아닌 CPU 레지스터에 직접 할당
② 루프 반복마다 RAM 접근 없이 레지스터 내에서 연산
③ 루프 종료 후 결과를 RAM에 한 번만 저장
→ 수십 배 성능 향상!
이것을 레지스터 할당(Register Allocation) 이라고 한다.
JVM이 "느리다"는 편견과 달리, JIT 최적화 이후엔 C에 근접한 성능이 나오는 이유가 여기에 있다.
5️⃣ 핵심 정리
| 개념 | 한 줄 요약 |
|---|---|
| 레지스터 | CPU 내부의 초고속 임시 저장 공간, 수십 개 수준 |
| PC Register | 다음 실행할 명령어 주소를 추적 |
| 메모리 계층 | 레지스터 → 캐시 → RAM → 디스크 순으로 느려지고 커짐 |
| JVM PC Register | 각 스레드가 독립적으로 보유, 스레드 전환 후 복귀 지점 기록 |
| JIT 레지스터 할당 | 자주 쓰는 변수를 RAM 대신 레지스터에 올려 성능 극대화 |
레지스터 = CPU의 손바닥 위 메모지
→ 가장 가깝고, 가장 빠르고, 가장 작다