
CPU의 구조: 제어장치, ALU, 레지스터
CPU는 사실 거대한 공장입니다. 그리고 그 안에는 관리자, 노동자, 그리고 작업대가 있습니다.

CPU는 사실 거대한 공장입니다. 그리고 그 안에는 관리자, 노동자, 그리고 작업대가 있습니다.
내 서버는 왜 걸핏하면 뻗을까? OS가 한정된 메모리를 쪼개 쓰는 처절한 사투. 단편화(Fragmentation)와의 전쟁.

미로를 탈출하는 두 가지 방법. 넓게 퍼져나갈 것인가(BFS), 한 우물만 팔 것인가(DFS). 최단 경로는 누가 찾을까?

이름부터 빠릅니다. 피벗(Pivot)을 기준으로 나누고 또 나누는 분할 정복 알고리즘. 왜 최악엔 느린데도 가장 많이 쓰일까요?

매번 3-Way Handshake 하느라 지쳤나요? 한 번 맺은 인연(TCP 연결)을 소중히 유지하는 법. HTTP 최적화의 기본.

코드를 짜다 보면 "왜 이 코드가 느리지?"라는 의문이 생길 때가 있습니다. 프로파일러를 돌려보면 특정 함수에서 병목이 걸리는데, 알고리즘 복잡도는 문제가 없습니다. 캐시 미스? 브랜치 프리딕션 실패? 이런 용어들이 나오기 시작하면, 결국 CPU가 내부적으로 어떻게 돌아가는지를 알아야 했습니다.
그래서 CPU를 뜯어보기로 했습니다. 물리적으로가 아니라, 개념적으로.
CPU는 그냥 "빠른 계산기"인 줄 알았습니다. "전기 넣으면 덧셈하는 기계" 정도로 생각했는데, 구조를 보니 생각보다 복잡했습니다.
한번에 다 이해하려니 머리가 터질 것 같아서, 공장 비유로 정리하기로 했습니다.
CPU를 현미경으로 들여다보면, 그 안에는 거대한 도시가 들어있습니다. 이 도시를 이해하는 가장 쉬운 비유는 공장입니다.
공장에는 세 가지 핵심 구성원이 있습니다:
이 세 가지가 CPU의 전부입니다. 나머지는 전부 이 구조의 변형이거나 최적화입니다.
오케스트라의 지휘자와 같습니다. 메모리에서 명령어를 읽어오고, 해석하고, 각 부품에게 지시를 내립니다.
직접 일은 안 하지만, 모든 흐름을 통제하는 Manager입니다.
제어장치가 하는 일을 좀 더 구체적으로 보면:
제어장치 없이는 ALU가 아무리 빨라도 뭘 계산해야 하는지 모릅니다. 공장에 노동자만 있고 관리자가 없으면 아무도 뭘 만들어야 하는지 모르는 것과 같습니다.
실제로 일을 하는 곳입니다. 두 가지 종류의 연산을 수행합니다.
산술 연산 (Arithmetic):
논리 연산 (Logic):
ALU 자체는 단순합니다. "시키신 덧셈 완료했습니다", "시키신 비교 연산 완료했습니다" — 묵묵히 계산만 하는 Worker입니다.
하지만 현대 CPU의 ALU는 단순한 덧셈기가 아닙니다. 부동소수점 연산을 위한 FPU(Floating Point Unit)가 별도로 존재하고, 벡터 연산을 위한 SIMD(Single Instruction, Multiple Data) 유닛도 들어있습니다. 하나의 명령어로 여러 데이터를 동시에 처리할 수 있어서, 이미지 처리나 과학 계산에서 성능이 크게 향상됩니다.
CPU가 일할 때 쓰는 초고속 임시 메모리입니다. RAM(메모리)이 '책장'이라면, 레지스터는 '책상 위'입니다.
책장에 있는 책을 가지러 왔다 갔다 하면 시간이 오래 걸리죠? 그래서 당장 계산할 숫자들은 책상(레지스터)에 올려놓고 작업하는 겁니다.
범용 레지스터 (General Purpose):
EAX, EBX, ECX, EDX 등이 있고, ARM에서는 R0~R15특수 목적 레지스터:
| 메모리 종류 | 접근 시간 | 비유 |
|---|---|---|
| 레지스터 | ~0.3ns | 책상 위에 놓인 메모지 |
| L1 캐시 | ~1ns | 서랍 안 |
| L2 캐시 | ~3-10ns | 같은 방 책장 |
| RAM | ~50-100ns | 복도 끝 도서관 |
| SSD | ~100,000ns | 다른 건물 창고 |
레지스터는 RAM보다 200배 이상 빠릅니다. CPU가 연산할 때마다 RAM까지 왔다 갔다 하면 성능이 바닥을 칩니다. 그래서 당장 필요한 데이터만 레지스터에 올려놓고, 계산이 끝나면 결과를 메모리에 기록하는 방식으로 작동합니다.
CPU는 전원이 켜진 순간부터 꺼질 때까지 딱 한 가지 루프를 반복합니다. 이것이 FDE(Fetch-Decode-Execute) 사이클이고, 초당 수십억 번 돌아갑니다.
이 세 단계가 하나의 명령어를 처리하는 전부입니다.
a = b + c; 같은 코드 한 줄도, CPU 입장에서는 여러 번의 FDE 사이클을 돌려야 합니다.
(b를 레지스터로 로드 → c를 레지스터로 로드 → 덧셈 → 결과를 a의 메모리 주소에 저장)
이 사이클의 속도를 결정하는 것이 클럭(Clock)입니다. 클럭은 일정한 간격으로 "틱, 틱, 틱" 신호를 보내는 메트로놈 같은 존재입니다.
매 틱마다 FDE 사이클의 한 단계가 진행됩니다. (실제로는 파이프라이닝으로 더 복잡하지만, 기본 원리는 이것) CPU가 빠르다는 건, 결국 이 공장이 1초에 수십억 번 돌아간다는 뜻입니다.
CPU를 설계할 때 근본적인 철학의 차이가 있습니다. "명령어를 복잡하게 만들까, 단순하게 만들까?"
철학: "하나의 명령어가 많은 일을 하게 하자."
철학: "명령어를 최대한 단순하게 유지하자."
재밌는 건, 오늘날 이 구분이 점점 흐려지고 있다는 것입니다. Intel의 x86 CPU는 겉으로는 CISC 명령어를 받지만, 내부적으로는 마이크로옵스(micro-ops)라는 RISC 스타일 명령으로 변환해서 실행합니다. Apple의 M1/M2 칩은 RISC(ARM) 기반이지만, 데스크톱급 성능을 내면서도 전력 효율이 뛰어납니다.
결국 "어떤 게 더 좋다"가 아니라, 용도에 따른 트레이드오프입니다.
이 구조를 보면 알 수 있듯이, CPU는 창의적인 생각을 하는 뇌가 아닙니다. 그저 제어장치(관리자)가 시키는 대로, 레지스터(책상)에 있는 데이터를 ALU(노동자)가 지지고 볶는 기계적인 공장일 뿐입니다.
하지만 이 공장이 초당 수십억 번(GHz) 돌아가기 때문에, 우리 눈에는 엄청나게 똑똑한 것처럼 보이는 것이죠.
우리가 코드로 if, for, +를 칠 때마다 이 공장 내부에서는 비상이 걸립니다.
관리자는 소리 지르고, 노동자는 땀 흘리고, 작업대는 정신없이 바뀝니다.
CPU 구조를 이해하고 나니 보이는 것들:
내 코드가 느리다면, 혹시 이 공장을 너무 비효율적으로 돌리고 있는 건 아닌지 생각해 볼 필요가 있습니다.