32비트와 64비트의 차이는 단순히 숫자가 두 배 커졌다는 의미가 아니다.
핵심은 CPU가 데이터를 다루는 기본 폭과 메모리 주소를 표현하는 범위가 달라진다는 데 있다.
가장 체감이 큰 차이는 바로 메모리 주소 공간이다.
RAM은 거대한 저장공간이고, CPU는 RAM 안에 있는 데이터를 가져오기 위해 각각의 위치를 구분해야 한다.
이를 위해 RAM의 각 위치에 번호가 있다고 생각하면 된다.
주소 0 → 어떤 1바이트
주소 1 → 다음 1바이트
주소 2 → 다음 1바이트
주소 3 → 다음 1바이트
...
CPU는 이 주소를 이용해 원하는 데이터를 찾는다.
CPU
↓
"주소 1000번의 데이터를 가져와"
↓
RAM
↓
해당 위치의 데이터를 CPU로 전달
즉, 메모리 주소는 쉽게 말해 RAM 내부의 위치를 나타내는 번호다.
주소 역시 결국 0과 1로 표현되는 숫자다.
예를 들어 주소를 2비트로 표현한다고 해보자.
00 → 주소 0
01 → 주소 1
10 → 주소 2
11 → 주소 3
2비트로 만들 수 있는 조합은 총 4개다.
일반화하면 다음과 같다.
n비트 → 2^n개의 서로 다른 값 표현 가능
따라서 32비트 주소라면
2^32개
의 주소를 표현할 수 있다.
메모리 주소 하나가 1바이트를 가리킨다고 하면,
2^32 byte
= 4,294,967,296 byte
≈ 4GB
가 된다.
즉 32비트 주소 공간은 대략 4GB 정도다.
기본적으로는 그렇게 이해하면 된다.
예를 들어 RAM을 16GB 장착했다고 해보자.
[ 4GB ][ 4GB ][ 4GB ][ 4GB ]
그런데 CPU와 운영체제가 사용하는 주소 공간이 32비트라면 표현할 수 있는 주소 범위가 제한된다.
즉 RAM이 물리적으로 많이 꽂혀 있어도 그 위치를 가리킬 주소가 부족해진다.
그래서 일반적인 32비트 환경에서는 큰 RAM을 제대로 활용하기 어렵다.
반면 64비트에서는 주소 공간이 훨씬 커진다.
32비트 → 2^32개의 주소
64비트 → 2^64개의 주소
64비트의 이론적인 주소 공간은 약 16EB 수준으로 매우 크다.
실제 CPU와 운영체제는 64비트 주소를 모두 사용하지는 않지만, 현재 사용되는 RAM 용량과 비교하면 충분히 넓다.
그렇다면 한 가지 의문이 생긴다.
CPU가 데이터를 계산한다면 그냥 CPU 내부에 모든 데이터를 저장하면 되지 않을까?
실제로 CPU 내부에도 데이터를 저장하는 공간이 있다.
대표적으로 다음과 같다.
CPU 내부
├─ Register
├─ L1 Cache
├─ L2 Cache
└─ L3 Cache
CPU 외부
└─ RAM
문제는 CPU 내부 저장공간은 매우 빠른 대신 비싸고 작다는 것이다.
대략적인 특징은 다음과 같다.
Register
↑ 가장 빠름
↑ 매우 작음
Cache
↑ 빠름
↑ 비교적 작음
RAM
↓ 상대적으로 느림
↓ 훨씬 큼
SSD
↓ 더 느림
↓ 매우 큼
즉 컴퓨터는 속도와 용량을 절충하기 위해 계층 구조를 사용한다.
프로그램이 실행되면 대략 다음 흐름으로 동작한다.
SSD
↓
프로그램을 RAM에 올림
↓
CPU가 필요한 데이터를 가져옴
↓
Cache
↓
Register
↓
ALU에서 계산
예를 들어 다음 코드가 있다고 해보자.
int a = 10;
int b = 20;
int c = a + b;
아주 단순화하면 다음과 같은 흐름이다.
RAM
a = 10
b = 20
↓ CPU가 가져옴
Register
R1 = 10
R2 = 20
↓ ALU 계산
R3 = 30
↓ 필요하다면
RAM에 결과 저장
CPU는 주소를 이용해 RAM에서 필요한 데이터를 찾아 가져오고, 실제 계산은 CPU 내부에서 수행한다.
전체적인 실행 흐름은 둘 다 같다.
프로그램
↓
RAM에 적재
↓
CPU가 주소를 이용해 명령어와 데이터를 가져옴
↓
Register에 저장
↓
ALU 등이 연산
↓
결과 저장
차이는 CPU가 사용하는 기본 데이터 폭과 주소 체계에 있다.
32비트 시스템은 대체로 다음과 같은 구조를 가진다.
32비트 중심 Register
32비트 주소/포인터
약 4GB 수준의 주소 공간
64비트 시스템은 다음과 같다.
64비트 중심 Register
64비트 포인터
훨씬 큰 주소 공간
그렇지는 않다.
64비트라는 이유만으로 모든 프로그램이 두 배 빨라지지는 않는다.
예를 들어
int a = 10;
int b = 20;
같은 작은 정수 계산은 32비트 CPU도 충분히 빠르게 처리할 수 있다.
64비트의 핵심은 처리 속도를 무조건 두 배로 만드는 것이 아니다.
대신 다음과 같은 장점이 있다.
가장 중요한 장점이다.
32비트
→ 주소 공간 약 4GB
64비트
→ 훨씬 큰 주소 공간
따라서 8GB, 16GB, 32GB, 64GB 이상의 RAM을 사용할 수 있다.
32비트 CPU는 기본적으로 32비트 크기의 값을 다루는 데 적합하다.
매우 큰 64비트 정수를 계산하려면 값을 여러 부분으로 나누어 계산해야 할 수 있다.
64비트 숫자
32비트 CPU
[상위 32비트][하위 32비트]
→ 여러 단계로 계산
64비트 CPU에서는 64비트 값을 범용 Register 하나에 담아 처리할 수 있다.
[ 64비트 값 ]
→ 한 번에 처리 가능
따라서 64비트 정수 연산에서는 더 유리할 수 있다.
CPU 내부 Register가 32비트에서 64비트로 넓어진다.
32비트 Register
[----------------]
64비트 Register
[--------------------------------]
따라서 더 큰 정수나 주소를 한 번에 저장할 수 있다.
예를 들어 x86에서 x86-64로 넘어가면서 단순히 Register 크기만 늘어난 것이 아니라 범용 Register 수도 증가했다.
Register가 많으면 CPU가 값을 RAM에 자주 저장하지 않고 Register에 더 오래 유지할 수 있다.
이것 역시 일부 프로그램의 성능에 도움이 될 수 있다.
비트 수를 늘리는 것은 공짜가 아니기 때문이다.
32비트 CPU를 64비트 CPU로 만든다는 것은 단순히 숫자 표기를 늘리는 일이 아니다.
CPU 내부 여러 회로가 더 큰 데이터를 처리할 수 있어야 한다.
비트 수 증가
↓
Register 커짐
↓
ALU 커짐
↓
데이터 경로 넓어짐
↓
배선 증가
↓
트랜지스터 증가
↓
칩 면적 증가
↓
전력 소비와 발열 증가
↓
비용 증가
예전 컴퓨터는 RAM 자체가 KB나 MB 단위인 경우가 많았다.
RAM이 16MB밖에 없는데 수십억 GB에 달하는 주소 공간을 지원하도록 CPU를 만들 필요는 없었던 것이다.
즉 당시에는 32비트만으로도 충분했다.
있다.
대표적인 예가 포인터 크기다.
일반적으로 32비트 프로그램에서는 포인터가 4바이트다.
sizeof(void *) == 4
64비트 프로그램에서는 보통 8바이트다.
sizeof(void *) == 8
즉 프로그램이 포인터를 매우 많이 사용한다면 64비트 환경에서는 메모리 사용량이 조금 증가할 수 있다.
예를 들어 포인터가 1천만 개라면 단순 계산으로
32비트
4 byte × 10,000,000
≈ 40MB
64비트
8 byte × 10,000,000
≈ 80MB
가 된다.
따라서 단순히 비트 수가 크다고 모든 면에서 무조건 좋은 것은 아니다.
가능성은 있지만, 가까운 미래에 일반 PC가 반드시 128비트로 넘어가야 할 이유는 크지 않다.
64비트만 해도 주소 공간이 엄청나게 크기 때문이다.
2^64 byte
≈ 16EB
게다가 실제 64비트 CPU도 주소 64비트를 전부 사용하는 것은 아니다.
현재 필요한 만큼만 사용하고 있기 때문에 64비트 체계 안에서도 아직 확장할 여지가 많다.
다만 128비트 연산 자체는 이미 존재한다.
현대 CPU에는 SIMD 명령을 위한
128비트
256비트
512비트
Register가 존재하기도 한다.
그렇다고 이를 128비트 컴퓨터나 512비트 컴퓨터라고 부르지는 않는다.
우리가 흔히 말하는 64비트 컴퓨터는 CPU의 범용 Register, 포인터, 주소 체계, ISA 등이 전반적으로 64비트 중심이라는 의미에 가깝다.
64비트로 바뀌었다고 해서 모든 작업이 자동으로 빨라지는 것은 아니다.
인터넷 속도는 주로 다음 요소의 영향을 받는다.
인터넷 회선
공유기
네트워크 지연
서버 속도
게임 성능은 주로 다음 요소가 중요하다.
CPU 자체 성능
GPU 성능
RAM 용량과 속도
SSD
게임 최적화
따라서
32비트 → 64비트
로 바뀌었다고 FPS가 두 배가 되거나 인터넷 속도가 두 배가 되는 것은 아니다.
하지만 간접적인 영향은 매우 크다.
현대 게임은 RAM을 8GB, 16GB 이상 사용하는 경우가 흔하다.
32비트 시스템에서는 이러한 큰 메모리를 제대로 활용하기 어렵다.
32비트 시스템 + RAM 16GB
→ 큰 메모리를 제대로 활용하기 어려움
64비트 시스템 + RAM 16GB
→ 충분히 활용 가능
즉 64비트 자체가 모든 프로그램을 빠르게 만드는 마법 같은 기술은 아니다.
대신 현대의 게임, 영상 편집, 데이터베이스, AI, 서버처럼 많은 메모리와 큰 데이터를 다루는 프로그램이 정상적으로 동작할 수 있는 기반을 제공한다.
32비트와 64비트를 이해할 때 다음 흐름으로 기억하면 된다.
비트 수
↓
표현 가능한 값의 범위가 달라짐
↓
표현 가능한 메모리 주소 범위가 달라짐
↓
접근 가능한 주소 공간이 달라짐
↓
사용 가능한 RAM 크기가 달라짐
그리고 CPU의 실행 과정까지 연결하면 다음과 같다.
CPU
↓
메모리 주소 지정
↓
RAM의 특정 위치 접근
↓
데이터를 CPU로 가져옴
↓
Register에 저장
↓
ALU 등에서 계산
↓
결과를 다시 Register 또는 RAM에 저장
결국 32비트에서 64비트로 넘어간 가장 큰 의미는 단순한 속도 향상이 아니다.
컴퓨터가 한 번에 다룰 수 있는 데이터와 메모리 주소의 범위가 크게 확장되었다는 것이다.
특히 현대 컴퓨터에서는 그중에서도 더 큰 메모리 주소 공간을 사용할 수 있게 된 것이 가장 중요한 변화라고 볼 수 있다.