에듀테크 프로젝트 대시보드
버스 구조 — CPU와 부품들이 대화하는 방법
CPU, 메모리, 입출력 장치는 서로 전선 다발로 연결되어 있어야 데이터를 주고받을 수 있다.
그런데 CPU와 메모리를 잇는 선, CPU와 키보드를 잇는 선, CPU와 디스크를 잇는 선을 전부 따로 깐다면
장치가 하나 늘어날 때마다 배선이 또 한 묶음씩 늘어나 메인보드 설계가 감당이 안 된다.
그래서 실제 컴퓨터는 모든 장치가 하나의 공용 통로(버스)를 함께 쓰도록 설계한다 —
시간을 나눠 쓰는 대신, 장치를 늘리고 싶으면 그냥 버스에 하나 더 꽂으면 된다. PCIe·USB 확장 슬롯이
가능한 이유이기도 하다. 앞서 폰 노이만 구조에서 "공용 버스" 자체는 이미 다뤘으니,
이 페이지에서는 그 버스 안에 실제로 무엇이 흐르는지를 파고든다.
장치 3개를 연결한다고 하면 개별 배선은 전용선 3묶음이 필요하지만, 버스는 트렁크 하나에 장치를 탭(tap)으로 연결하면 끝난다. 장치가 30개가 돼도 버스는 여전히 하나다.
"버스"라고 뭉뚱그려 부르지만 실제로는 역할이 다른 세 다발이 나란히 지나간다. 아래 각 카드의 화살표 방향과 진하기가 그 버스의 성격이다.
CPU가 "어디에 접근할지" 주소를 실어 보낸다. 주소는 버스에 연결된 모든 장치에 도달하지만, 그 번지를 담당하는 장치만 반응한다(주소 디코딩).
실제 값이 오가는 통로. 읽기일 땐 장치→CPU, 쓰기일 땐 CPU→장치로 방향이 바뀌는 양방향 버스다.
READ/WRITE, 클럭, 인터럽트 요청 같은 "무엇을 하라"는 신호. 대부분 CPU→장치지만 인터럽트처럼 장치→CPU로 가는 선도 섞여 있다.
"CPU가 100번지의 값을 읽는다"는 한 문장 뒤에는 세 종류 버스가 순서대로 움직이는 4단계가 숨어 있다. 아래 버튼으로 READ/WRITE를 골라 한 사이클씩 재생해 보자.
버스는 "선의 개수(폭)"가 곧 능력이다. 주소버스가 넓을수록 더 많은 메모리를, 데이터버스가 넓을수록 한 번에 더 많은 값을 다룬다.
// 주소버스 폭 n비트 → 표현 가능한 주소 개수 2^n → 곧 메모리 용량(바이트) capacity_bytes = pow(2, n) // 예: n = 32 (32비트 주소버스, 옛 32비트 OS의 한계였던 그 4GB) capacity_bytes = pow(2, 32) = 4,294,967,296 // = 4GB // 데이터버스 폭 m비트 → 한 번에 옮기는 바이트 수 bytes_per_transfer = m / 8 // 예: m = 64 → 8바이트, m = 128 (GPU 메모리 버스 등) → 16바이트
버스는 공용이기 때문에 문제가 생긴다 — CPU, DMA 컨트롤러, 여러 코어가 동시에 버스에 신호를 실으면 전기 신호가 충돌해 값이 깨진다. 그래서 버스에는 항상 지금 누가 버스를 쓸 차례인지 결정하는 버스 중재기(Bus Arbiter)가 있다. 데이지 체인, 중앙 집중식 우선순위 방식 등 구체적인 알고리즘은 다양하지만 핵심 원칙은 하나 — 한 순간에 버스의 주인은 단 하나여야 한다는 것이다.