Skip to main content
Summary

혼자 있는 CPU는 아무것도 할 수 없다

앞장에서 CPU 안에는 ALU, 제어장치, 레지스터가 있다는 것을 보았다. 그런데 CPU만 책상 위에 덩그러니 놓여 있다면 무엇을 할 수 있을까?

거의 아무것도 못 한다.

명령어도 밖에서 가져와야 하고, 계산할 데이터도 받아야 한다. 계산 결과를 오래 보관하려면 메모리나 저장장치에 보내야 한다. 사람이 누른 키보드 입력도 받아야 하고, 화면에 결과도 내보내야 한다.

즉 CPU는 똑똑한 작업자일 수 있지만, 혼자서는 재료도 없고 창고도 없고 손님과 이야기할 창구도 없다. 컴퓨터가 되려면 CPU, 메모리, 입력 장치, 출력 장치가 서로 연결되어야 한다.

이때 필요한 것이 버스다.

여기서 버스는 사람을 태우는 자동차가 아니다. 컴퓨터에서 버스는 여러 부품이 신호를 주고받는 공용 길이다. 학교 복도처럼 여러 교실을 이어 주고, 도시의 도로처럼 물건과 메시지가 오가게 한다.

컴퓨터 부품들은 이 길 위에서 0과 1의 신호를 주고받는다. 하지만 길만 있다고 대화가 되는 것은 아니다. "어디로 보낼지", "무엇을 보낼지", "읽을지 쓸지"를 정하는 약속도 필요하다.

그래서 컴퓨터의 통신 길은 보통 세 가지 역할로 나누어 생각한다.

부품들이 대화하는 길AI 생성 이미지

세 가지 길: 주소, 데이터, 제어

컴퓨터 안의 대화를 우체국에 비유해 보자.

편지를 보내려면 세 가지가 필요하다.

  • 편지를 받을 주소

  • 편지 안에 담긴 내용

  • 보내는 방식에 대한 지시

컴퓨터도 비슷하다.

이름하는 일비유
주소 버스어느 메모리 칸이나 장치를 찾을지 알려 준다편지 봉투의 주소
데이터 버스실제 0과 1의 값을 운반한다편지 안의 내용물
제어 버스읽기, 쓰기, 준비 완료 같은 명령을 알린다"배달", "수거", "기다려" 같은 지시

먼저 주소 버스는 목적지를 가리킨다. CPU가 메모리의 100번 칸에서 값을 읽고 싶다면, 주소 버스에 "100번"에 해당하는 0과 1을 내보낸다. 주소 버스의 선이 많을수록 더 많은 장소를 가리킬 수 있다. 주소를 적는 칸이 길수록 더 많은 집을 구분할 수 있는 것과 같다.

데이터 버스는 실제 값을 옮긴다. 메모리에서 읽은 숫자, 명령어, 글자 코드, 색 정보가 이 길을 지나간다. 데이터 버스가 8비트라면 한 번에 8개의 0과 1, 즉 1바이트를 옮길 수 있다. 32비트나 64비트라면 한 번에 더 큰 묶음을 옮길 수 있다.

제어 버스는 행동을 알려 준다. 같은 주소와 같은 데이터라도 상황에 따라 의미가 달라진다. CPU가 메모리에서 값을 읽으려는 것인지, 메모리에 값을 쓰려는 것인지 알려 주어야 한다. 또 어떤 장치가 준비되었는지, 지금 버스를 써도 되는지, 클록 박자에 맞춰 언제 값을 잡아야 하는지도 제어 신호가 알려 준다.

주소는 "어디?", 데이터는 "무엇?", 제어는 "어떻게?"라고 생각하면 쉽다.

CPU가 메모리에서 값을 읽는 과정

이제 CPU가 메모리에서 값을 읽는 장면을 천천히 따라가 보자. 예를 들어 CPU가 메모리의 20번 주소에 들어 있는 값을 읽고 싶다고 하자.

첫째, CPU의 제어장치가 "20번 주소를 읽어야 한다"고 결정한다. 이 주소는 프로그램 카운터에서 온 명령어 주소일 수도 있고, 명령어 안에 적힌 데이터 주소일 수도 있다.

둘째, CPU는 주소 버스에 20번 주소를 올려놓는다. 실제로는 "20"이라는 십진수 글자를 보내는 것이 아니라, 20을 이진수로 표현한 전압 신호들이 여러 선에 동시에 나타난다.

셋째, CPU는 제어 버스에 읽기 신호를 보낸다. 이것은 메모리에게 "지금 주소 버스에 적힌 위치의 값을 데이터 버스에 내보내라"는 뜻이다.

넷째, 메모리는 주소를 확인한다. 메모리 안에는 수많은 칸이 있지만, 주소 해석 회로가 그중 20번 칸을 고른다. 도서관에서 청구기호를 보고 정확한 책장을 찾는 것과 비슷하다.

다섯째, 메모리는 20번 칸의 값을 데이터 버스에 올려놓는다. 그러면 데이터 버스의 여러 선에는 0과 1의 전압 패턴이 생긴다.

여섯째, CPU는 정해진 순간에 그 값을 읽어 레지스터에 저장한다. 클록의 박자에 맞춰 "지금 데이터가 안정되었으니 잡아라" 하고 받아들이는 것이다.

이 과정을 짧게 쓰면 다음과 같다.

  1. CPU가 주소를 내보낸다.

  2. CPU가 읽기 신호를 보낸다.

  3. 메모리가 해당 주소의 데이터를 내보낸다.

  4. CPU가 데이터를 받아 레지스터에 저장한다.

사람이 보기에는 여러 단계지만, 실제 회로에서는 매우 빠르게 반복된다. 프로그램을 실행한다는 것은 이런 읽기와 쓰기의 흐름이 끊임없이 이어지는 일이다.

CPU가 메모리에 값을 쓰는 과정

이번에는 반대로 CPU가 계산 결과를 메모리에 저장한다고 해 보자. 예를 들어 레지스터에 들어 있는 값 7을 메모리의 30번 주소에 쓰고 싶다.

읽기와 비슷하지만, 데이터가 흐르는 방향이 달라진다.

첫째, CPU는 주소 버스에 30번 주소를 올린다.

둘째, CPU는 데이터 버스에 저장할 값 7을 올린다. 실제로는 7을 이진수로 나타낸 신호가 데이터 버스에 놓인다.

셋째, CPU는 제어 버스에 쓰기 신호를 보낸다. 이것은 메모리에게 "주소 버스가 가리키는 칸에 데이터 버스의 값을 저장하라"는 뜻이다.

넷째, 메모리는 쓰기 신호가 들어온 순간에 30번 칸의 내용을 새 값으로 바꾼다.

읽을 때는 메모리가 데이터 버스에 값을 내보낸다. 쓸 때는 CPU가 데이터 버스에 값을 내보낸다. 같은 길이지만, 상황에 따라 말하는 쪽과 듣는 쪽이 바뀐다.

그래서 제어 신호가 중요하다. 제어 신호가 없다면 메모리는 지금 값을 내보내야 하는지, 받아서 저장해야 하는지 알 수 없다.

여러 장치가 같은 길을 쓰면 어떻게 될까

버스는 공용 길이다. 공용 길은 편리하지만 문제가 있다. 모두가 동시에 말하면 시끄러워진다.

데이터 버스에서도 같은 일이 생길 수 있다. CPU와 메모리와 다른 장치가 동시에 데이터 버스에 서로 다른 값을 밀어 넣으면 어떻게 될까? 한쪽은 1을 만들려고 높은 전압을 내고, 다른 쪽은 0을 만들려고 낮은 전압을 만들 수 있다. 그러면 신호가 망가지고, 심하면 회로에 무리가 갈 수도 있다.

그래서 컴퓨터에는 충돌을 피하는 규칙이 있다.

첫째, 선택 신호를 사용한다. 여러 메모리 칩이나 장치가 버스에 연결되어 있어도, 그중 하나만 선택되어 말할 수 있게 한다. 나머지는 조용히 기다린다. 교실에서 선생님이 한 학생을 지목하면 그 학생만 대답하는 것과 같다.

둘째, 장치의 출력은 필요할 때만 버스에 연결된다. 많은 디지털 회로는 0, 1뿐 아니라 사실상 "나는 지금 말하지 않겠다"에 해당하는 상태를 가질 수 있다. 이것을 어려운 말로 고임피던스 상태라고 한다. 비유하면 마이크 전원을 끄고 입을 다무는 상태다. 버스에 연결되어 있지만 신호를 밀어 넣지 않는다.

셋째, 여러 장치가 버스를 쓰고 싶을 때는 순서 정하기가 필요하다. CPU뿐 아니라 어떤 장치는 메모리와 직접 데이터를 주고받고 싶을 수 있다. 이때는 버스 사용권을 관리하는 회로가 "이번에는 CPU, 다음에는 다른 장치"처럼 차례를 정한다. 도로의 신호등이나 교차로의 교통경찰과 비슷하다.

넷째, 느린 장치를 기다리는 신호도 있다. CPU는 매우 빠르지만 모든 장치가 같은 속도로 대답할 수 있는 것은 아니다. 어떤 장치는 "아직 준비되지 않았으니 조금만 기다려"라는 신호를 보낼 수 있다. 그러면 CPU는 다음 단계로 급히 넘어가지 않고 기다린다.

중요한 점은 이것이다. 버스는 단순한 전선 묶음이 아니다. 누가 언제 말하고, 누가 듣고, 언제 값을 믿어도 되는지 정한 약속까지 포함해야 제대로 동작한다.

메모리뿐 아니라 장치도 주소를 가진다

주소라고 하면 메모리 칸만 떠올리기 쉽다. 하지만 컴퓨터에서는 키보드, 화면 장치, 저장장치 같은 입출력 장치도 CPU와 대화해야 한다.

CPU 입장에서 장치는 특별한 창구처럼 보일 수 있다. 예를 들어 어떤 주소는 RAM의 한 칸을 가리키고, 어떤 주소는 화면 장치의 설정 칸을 가리킬 수 있다. CPU가 그 주소에 값을 쓰면 화면 색이 바뀌거나, 소리 장치가 소리를 낼 준비를 할 수 있다.

이처럼 장치를 메모리 주소처럼 다루는 방식을 메모리 맵 입출력이라고 부른다. 이름은 길지만 생각은 간단하다. "장치에도 번호가 붙은 작은 우편함을 주자"는 것이다. CPU는 특별한 마법을 쓰지 않는다. 주소를 내보내고, 데이터를 주고받고, 제어 신호로 읽기와 쓰기를 구분한다.

물론 실제 컴퓨터의 입출력 방식은 장치마다 더 복잡한 규칙을 가진다. 하지만 출발점은 같다. CPU는 주소, 데이터, 제어 신호를 이용해 바깥 장치와 약속된 방식으로 대화한다.

메인보드는 통신 규칙의 무대다

컴퓨터를 열어 보면 큰 판 하나가 보인다. 이 판을 메인보드라고 한다. 겉으로 보면 부품을 꽂는 받침대처럼 보인다. 하지만 메인보드는 단순한 판이 아니다.

메인보드에는 구리로 된 가느다란 길들이 그려져 있다. 이 길을 통해 전원, 주소 신호, 데이터 신호, 제어 신호, 클록 신호가 이동한다. CPU 소켓, 메모리 슬롯, 저장장치 연결부, USB 포트 같은 곳은 모두 이 길 위의 정해진 위치에 놓인다.

메인보드는 도시 지도와 비슷하다. 도로가 아무렇게나 나 있으면 차가 엉킨다. 주소 체계가 없으면 배달이 안 된다. 신호등이 없으면 교차로가 위험해진다. 컴퓨터도 마찬가지다. 선이 연결되어 있다는 것만으로는 부족하다. 어느 선이 어떤 의미인지, 어떤 속도로 신호를 주고받을지, 전압 기준은 무엇인지, 어떤 순서로 시작할지까지 정해져야 한다.

그래서 메인보드는 부품들이 만나는 통신의 무대다. CPU와 메모리, 저장장치, 그래픽 장치, USB 장치가 서로 다른 역할을 하면서도 하나의 컴퓨터처럼 움직일 수 있게 길과 규칙을 제공한다.

현대 컴퓨터에서는 모든 장치가 하나의 단순한 버스만 공유하지는 않는다. 빠른 장치는 빠른 전용 통로를 쓰고, 느린 장치는 다른 방식으로 연결되기도 한다. 그래도 기본 생각은 변하지 않는다. 부품들은 약속된 길과 신호 규칙을 통해 데이터를 주고받는다.

부품이 시스템이 되는 순간

지금까지 우리는 작은 스위치에서 출발해 논리 게이트, 덧셈 회로, 기억 회로, CPU의 내부 구조까지 올라왔다. 하지만 컴퓨터는 CPU 하나로 완성되지 않는다.

컴퓨터가 진짜로 움직이려면 부품들이 서로 말을 해야 한다.

CPU는 메모리에서 명령어를 읽는다. 메모리에서 데이터를 가져온다. ALU가 계산한다. 결과를 다시 메모리에 저장한다. 입력 장치에서 들어온 값을 읽고, 출력 장치에 표시할 값을 쓴다.

이 모든 흐름의 바탕에는 세 가지 질문이 있다.

  • 어디와 대화할까? → 주소

  • 무엇을 주고받을까? → 데이터

  • 어떤 방식으로 움직일까? → 제어 신호

컴퓨터 부품은 혼자서는 아무것도 못 한다. 그러나 약속된 길과 언어가 생기면 이야기가 달라진다. CPU는 명령어를 읽고, 메모리는 값을 내어 주고, 장치는 바깥세상과 연결된다.

그때 비로소 부품들은 따로 놓인 조각이 아니라 하나의 시스템이 된다.

핵심 정리

  • 버스는 컴퓨터 부품들이 신호를 주고받는 공용 길이다.

  • 주소 버스는 어느 메모리 칸이나 장치를 찾을지 알려 준다.

  • 데이터 버스는 실제 0과 1의 값을 운반한다.

  • 제어 버스는 읽기, 쓰기, 준비, 선택 같은 동작 규칙을 전달한다.

  • 여러 장치가 같은 버스를 쓸 때는 선택 신호, 순서 정하기, 기다림 신호로 충돌을 피한다.

  • 메인보드는 부품을 꽂는 판을 넘어, 신호가 오가는 길과 통신 규칙을 담은 무대다.

책 목록

처음부터 이해하는 컴퓨터 만들기

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기