RAM·CPU·입출력 프로세서와 입출력 장치의 데이터 흐름 구성도

컴퓨터 구조를 설명할 때는 복잡한 하드웨어를 처리, 기억, 입출력이라는 역할로 나누면 각 부품의 책임과 데이터 흐름을 이해하기 쉽다. 여기서는 전통적인 단순화 모델에 따라 CPU·주기억장치·입출력 계층으로 나누어 살펴본다.

CPU (Central Processing Unit)

중앙처리장치는 다음 기능을 중심으로 동작한다.

  1. 산술·논리 연산 장치(ALU) — 덧셈, 비교, 논리 연산처럼 데이터를 처리한다.
  2. 레지스터 — 명령어, 주소, 연산 중간값을 CPU 내부에 임시로 보관한다. 레지스터의 종류와 실제 CPU에서의 차이는 CPU 레지스터 종류와 비트 수에서 별도로 다룬다.
  3. 제어 장치 — 명령어를 가져오고(fetch), 해석하고(decode), 실행하도록(execute) 각 장치를 제어한다.

ALU, 레지스터, 제어 장치의 역할을 구분하면 “어디에서 계산하고, 어디에 잠시 저장하며, 누가 실행 순서를 조정하는가”를 단계별로 추적할 수 있다.

이 구분은 명령 실행 흐름을 이해하기 위한 개념 모델이다. 실제 현대 CPU에는 캐시, load/store unit, 분기 예측기와 여러 실행 유닛 등이 더 있으며, 내부 구현이 반드시 그림의 세 블록으로만 나뉘는 것은 아니다.

RAM (Random Access Memory)

RAM은 실행 중인 명령어와 데이터를 CPU가 읽고 쓰는 주기억장치다. 임의 접근(Random Access)은 앞선 위치를 순서대로 통과하지 않고 주소로 임의 위치를 직접 선택할 수 있다는 뜻이다.

다만 모든 주소의 실제 접근 시간이 완전히 같다는 뜻은 아니다. DRAM 지연시간은 행(row) 적중 여부, 뱅크 상태, 메모리 컨트롤러와 캐시 등에 따라 달라질 수 있다. 테이프처럼 앞부분부터 순서대로 이동해야 하는 순차 접근 매체와 달리, RAM은 원하는 주소를 직접 선택할 수 있다는 점이 핵심이다.

CPU가 처리하는 모든 정보가 반드시 RAM을 거치는 것은 아니다. 레지스터나 캐시에서 작업이 끝날 수도 있다. 그래도 RAM은 CPU와 보조기억장치 사이의 핵심 작업 공간이므로 용량과 대역폭, 지연시간이 시스템 성능에 큰 영향을 준다.

운영체제가 RAM과 가상 주소를 연결하는 방식은 Windows 가상 메모리와 C# Thread·Task 이해하기의 Reserve·Commit 설명에서 이어서 볼 수 있다.

입출력 계층과 IOP

입출력 처리는 장치 컨트롤러, DMA 엔진 또는 전용 입출력 프로세서가 맡을 수 있다. IOP(Input/Output Processor)는 그중 CPU 대신 입출력 명령과 전송을 수행하는 전용 프로세서를 가리키며, 모든 현대 PC가 독립된 IOP를 반드시 갖는 것은 아니다.

키보드 입력이나 저장장치의 블록 전송처럼 상대적으로 느린 장치 작업을 별도의 컨트롤러가 처리하면 CPU는 계산과 프로그램 실행을 계속할 수 있다. 이때 인터럽트는 장치 작업의 완료나 오류를 CPU에 알리는 대표적인 방법이다.


16비트 / 32비트 / 64비트 — 레지스터, 데이터 버스, 주소 폭은 서로 다르다

“몇 비트 CPU”라는 말은 하나의 버스 폭을 뜻하지 않는다. 보통은 명령어 집합(ISA)이 기본적으로 다루는 정수 레지스터와 피연산자의 폭을 가리키지만, 외부 데이터 버스 폭주소 폭은 별개의 값이다. 따라서 CPU가 16비트라고 해서 주소도 반드시 16비트인 것은 아니다.

프로세서/모드 ISA·주요 정수 레지스터 외부 데이터 버스 주소 폭과 주소 공간
Intel 8088 16비트 8비트 20비트 물리 주소 → 2²⁰ byte = 1 MiB
Intel 8086 16비트 16비트 20비트 물리 주소 → 2²⁰ byte = 1 MiB
Intel386 DX 32비트 32비트 32비트 물리 주소 → 2³² byte = 4 GiB
x86-64의 64비트 모드 64비트 CPU의 “64비트” 명칭만으로 정해지지 않음 구현된 선형 주소 폭과 물리 주소 폭에 따라 달라짐

8088이 좋은 반례다. 내부 실행 장치와 레지스터는 16비트이지만 외부 데이터 버스는 8비트이고, 물리 주소는 20비트이므로 64 KiB가 아니라 1 MiB를 주소 지정할 수 있다. 즉 CPU 비트 수, 한 번의 외부 전송 폭, 주소 가능한 메모리 범위를 같은 숫자로 묶으면 안 된다.

주소 폭을 실제 용량으로 계산하기

바이트 주소 방식에서는 주소 비트가 하나 늘 때마다 구분 가능한 바이트 위치가 두 배가 된다.

주소 폭 2ⁿ바이트의 수학적 크기
20비트 1 MiB
32비트 4 GiB
48비트 256 TiB
57비트 128 PiB
64비트 16 EiB

예를 들어 8088의 20개 주소선은 2²⁰ = 1,048,576개의 바이트 위치를 구분한다. 1 MiB = 2²⁰ byte이므로 주소 공간은 1 MiB다. 이 계산값은 주소로 표현할 수 있는 범위의 상한이며, 실제 장착 가능한 RAM이나 한 프로세스가 사용할 수 있는 범위와 같다는 뜻은 아니다.

바이트 단위로 주소를 매기는 시스템에서 주소선이 n비트라면 이론상 2ⁿ개의 바이트 위치를 구분할 수 있다. 이 계산은 주소 폭에 적용된다. 예를 들어 32비트 선형 주소 공간은 4 GiB지만, 32비트 x86도 PAE를 사용하면 운영체제가 4 GiB보다 많은 물리 메모리를 관리할 수 있다. 다만 개별 32비트 프로세스의 가상 주소 공간은 여전히 4 GiB다.

2⁶⁴ byte는 16 EiB(약 18.4 EB)이지만, 이것은 64비트 주소를 모두 구현한다고 가정한 수학적 상한이다. x86-64는 4단계 페이징에서 일반적으로 48비트, 5단계 페이징에서 57비트의 선형 주소를 변환한다. 실제 장착 가능한 RAM은 CPU가 구현한 물리 주소 폭, 메모리 컨트롤러, 메인보드와 운영체제의 한도에 의해 더 작아진다.

64비트 환경이 언제나 더 빠른 것도 아니다. 페이지 교체는 프로그램의 작업 집합이 실제 RAM과 시스템의 메모리 한도를 넘을 때 발생한다. 64비트 모드는 더 넓은 가상 주소 공간과 추가 레지스터·명령을 제공할 수 있지만, 포인터가 커져 메모리 사용량이 늘 수도 있다. 성능 차이는 같은 작업을 실제로 측정해 판단해야 한다.

핵심 정리

  • CPU의 비트 수, 외부 데이터 버스 폭, 주소 폭은 서로 다른 개념이다.
  • Intel 8088은 16비트 CPU이지만 8비트 외부 데이터 버스와 20비트 주소를 사용해 1 MiB를 주소 지정한다.
  • 2ⁿ byte 계산의 n은 CPU의 이름이 아니라 해당 주소 공간의 주소 폭이다.
  • x86-64도 전체 64비트 주소 공간을 그대로 구현하지 않으며, 선형 주소와 물리 주소의 한도도 구분해야 한다.
  • 64비트 전환 자체가 페이지 교체를 없애거나 프로그램을 자동으로 빠르게 만들지는 않는다.

관련 글

참고 자료