컴퓨터의 고속도로: 버스(Bus)
CPU, 메모리, 주변 장치가 아무리 빠르더라도 서로 데이터를 주고받을 “길”이 없다면 성능은 나오지 않습니다.
버스(Bus)는 컴퓨터 구성 요소 간에 데이터·주소·제어 신호를 전달하기 위해 공통적으로 사용되는 통로입니다.
특히 서버/백엔드 성능 문제의 상당수는 “CPU가 느린 게 아니라, 데이터가 이동하는 경로(버스/메모리 계층)에서 대기”하는 형태로 나타납니다.
백엔드 관점 한 줄
“버스”를 이해하면 캐시 미스, 메모리 병목, I/O 지연 같은 문제를
단순 추측이 아니라 “데이터 이동 경로”로 설명할 수 있습니다.
1. 시스템 버스 (System Bus)
전달하는 정보의 종류에 따라 3가지로 구분됩니다.시스템 버스는 CPU가 메모리/입출력 장치와 통신할 때 사용하는 기본 통로이며, 일반적으로 주소 버스(Address), 데이터 버스(Data), 제어 버스(Control)로 나뉩니다.
① 주소 버스 (Address Bus)
CPU가 메모리나 I/O 장치의 위치(주소)를 지정하기 위한 통로입니다. 보통 단방향(CPU → 외부)입니다.
주소 버스 폭이 n비트라면, 표현 가능한 주소는 최대 2n개입니다.
(예: n=32라면 232 주소 공간)
② 데이터 버스 (Data Bus)
명령어/데이터를 실제로 실어 나르는 통로이며 양방향(CPU ↔ 메모리/I/O)입니다.
흔히 말하는 “32비트/64비트”는 (아키텍처 맥락에 따라) 데이터 처리 단위와 관련이 있고,
데이터 버스 폭은 한 번에 옮길 수 있는 데이터량과 연결됩니다.
③ 제어 버스 (Control Bus)
CPU가 다른 구성 요소에 제어 신호(read/write, interrupt, acknowledge 등)를 보내거나
반대로 상태 신호를 받는 통로입니다.
데이터/주소만으로는 “무엇을 하라”를 표현할 수 없기 때문에, 제어 버스가 전체 통신을 성립시킵니다.
| 구분 | 전달하는 것 | 대표 예시 |
| 주소 버스 | 어느 위치를 볼지 | 0x1000 번지, 특정 I/O 레지스터 주소 |
| 데이터 버스 | 무엇을 옮길지 | 명령어, 변수 값, 디스크에서 읽은 블록 |
| 제어 버스 | 어떻게 처리할지 | Read/Write, Interrupt Request, ACK |
2. 버스가 작동하는 실제 과정(메모리 읽기)
메모리에서 값을 읽는 순간, 주소/제어/데이터 버스는 “협업”합니다. 아래는 CPU가 특정 주소의 데이터를 읽는 과정을 신호 관점으로 단순화한 시나리오입니다.
- 🚀 STEP 1. 주소 버스(Address): CPU가 “이 주소가 필요하다”는 주소 값을 내보냅니다.
- 📢 STEP 2. 제어 버스(Control): CPU가 “읽기(Read)” 신호를 보냅니다. (그리고 필요한 타이밍 신호/상태 확인)
- 📦 STEP 3. 데이터 버스(Data): 메모리(또는 캐시)가 해당 주소의 데이터를 데이터 버스에 실어 CPU로 전달합니다.
- ✅ STEP 4. 완료(Ack/완료 신호): 전송이 끝나면 완료 상태가 반영되고 CPU는 다음 단계로 진행합니다.
핵심 인사이트
“주소를 지정하고(Read), 데이터를 받는다”는 동작은 단순해 보이지만,
실제로는 캐시/메모리 컨트롤러/버스 중재 같은 계층이 개입합니다.
그래서 서버 성능 문제는 “연산이 느리다”보다 “데이터가 늦게 온다”로 설명되는 경우가 많습니다.
3. 버스 폭(Bus Width)과 대역폭(Bandwidth)
도로의 차선이 많을수록 교통량이 늘어나듯, 버스 폭은 “한 번에 얼마나 옮길 수 있나”를 결정합니다. 다만 실제 성능은 폭뿐 아니라 클럭(주파수), 프로토콜 오버헤드, 동시 접근(중재)의 영향을 함께 받습니다.
| 구분 | 설명 |
| 데이터 버스 폭 | 한 번에 전송 가능한 비트 수(폭). 대역폭은 “폭 × 주파수(대략)”로 직관을 잡을 수 있습니다. |
| 주소 버스 폭 | CPU가 지정할 수 있는 최대 주소 공간. n비트면 최대 2n개 주소를 표현합니다. |
백엔드 실무에서 자주 나오는 연결
대규모 트래픽 서버에서 병목이 생길 때, CPU 사용률이 낮은데도 느리다면 “버스/메모리 대기”를 의심할 수 있습니다.
대표적으로 캐시 미스가 많아 DRAM 접근이 늘거나, NUMA 환경에서 원격 메모리 접근이 증가하면 지연이 커질 수 있습니다.
4. 백엔드 개발자 관점: 버스/데이터 이동이 병목이 되는 순간
- ✔ 캐시 미스 증가: CPU가 데이터를 못 찾고 메모리로 내려가며 대기 시간이 커짐
- ✔ 락 경쟁/공유 쓰기: 여러 코어가 같은 캐시 라인을 두고 경쟁 → 코히어런시 트래픽 증가
- ✔ I/O 경로 혼잡: NIC/스토리지 같은 장치가 PCIe/컨트롤러를 통해 데이터 이동 → 지연/큐잉 발생
- ✔ 메모리 대역폭 포화: 처리량이 늘어날수록 DRAM 대역폭이 먼저 한계에 도달할 수 있음
실전 사고 프레임
“느리다”를 만났을 때 CPU 사용률만 보지 말고,
CPU가 계산 중인지 vs 데이터를 기다리는 중인지(메모리/I/O 대기)를 먼저 분리해보면 진단 속도가 빨라집니다.
🎓 연결 고리 정리
앞서 배운 MAR(메모리 주소 레지스터)는 “지금 접근할 주소”를 담고 주소 버스로 연결됩니다.
MBR(메모리 버퍼 레지스터)는 메모리에서 오가는 “데이터”를 잠시 담는 버퍼이며(일부 교재에서는 MDR로도 부릅니다),
데이터 버스와 연결됩니다.
그리고 제어장치는 제어 버스를 통해 읽기/쓰기 같은 제어 신호를 내리고,
상태 신호를 받아 전체 흐름을 조율합니다.
즉, MAR → Address Bus, MBR(MDR) → Data Bus, Control Unit → Control Bus로 매핑해두면
“CPU가 메모리를 어떻게 건드리는지”가 한 장면으로 정리됩니다.