공부를 하다 보면 정말 기본적인 개념에서 문득 막히는 순간이 온다.
나에겐 그게 바로 바이트, 비트, 주소였다.
특히 CS:APP 9장 가상 메모리(Virtual Memory)를 공부하면서
비트/바이트/주소에 대해 머릿속이 복잡해졌다.
그래서 나처럼 헷갈릴 수 있는 사람들을 위해 간단히 정리해보았다.
1bit 0 또는 1 → 이진수 한 자리1byte = 8비트 → 일반적으로 데이터를 저장하는 최소 단위1 Byte = 8 bits
예: 10101010 (8자리)
1byte 단위로 나누어 저장한다.예: char 1바이트, int 4바이트 (32비트), …
메모리 주소 자체는 가로줄을 가리키는 참조값일 뿐이다.
그 자체가 따로 메모리 공간을 차지하진 않는다.
하지만 주소도 결국 하나의 값(value)이다.
따라서 이 주소를 변수에 저장하게 되면, 그 변수는 메모리 공간을 차지하게 된다.
int x = 8;
int *y = &x; // x의 주소를 y라는 포인터 변수에 저장
여기서 x는 8이라는 정수 값을 저장하고,
y는 x의 주소값을 저장한다.
이때 y 자체도 메모리 공간에 저장되며,
그 안에는 “x는 이 위치에 있어요”라는 주소 값이 담기게 된다.
컴퓨터는 2진수 세계이기 때문에,
단위도 2의 제곱 단위로 나아간다!
| 단위 | 약어 | 크기 (바이트 기준) | 2의 거듭제곱 |
|---|---|---|---|
| 비트 | bit | - | - |
| 바이트 | B | 8비트 | 2³ 비트 |
| 킬로바이트 | KB | 1,024 B | 2¹⁰ B |
| 메가바이트 | MB | 1,024 KB | 2²⁰ B |
| 기가바이트 | GB | 1,024 MB | 2³⁰ B |
| 테라바이트 | TB | 1,024 GB | 2⁴⁰ B |
우리는 평소 킬로 = 1000으로 알고 있지만,
컴퓨터는 2진수 기반이라서 2¹⁰ = 1024를 더 자연스럽게 쓴다고 한다.
1 KB = 2^10 B = 1024 B
즉, 1000이 아니라 1024를 기준으로 단위를 올린다.
9장에서 헷갈릴 법한 개념 중 하나가 바로 주소 공간과 비트 수의 관계다.
n비트로 표현할 수 있는 주소는 최대 2^n개.
예를 들어:
| 비트 수 | 표현 가능한 주소 수 | 커버 가능한 바이트 수 |
|---|---|---|
| 1비트 | 2 (0~1) | 2B |
| 2비트 | 4 (0~3) | 4B |
| 10비트 | 1024 (0~1023) | 1024B = 1KB |
즉, 10비트짜리 주소 공간이면 1024개의 바이트 주소를 만들 수 있고,
→ 그 말은 1KB 크기의 메모리 공간을 표현할 수 있다는 뜻이다.
이렇게 해석하면 된다.
"10비트짜리 주소 공간이면 → 1024개의 주소 가능
주소는 각 1바이트를 가리킨다.
즉, 1024개의 주소가 있다면 -> 1024개의 바이트를 가리킬 수 있다는 뜻이다.
이건 1KB의 메모리를 "소유"하기 위한 비트 수가 아니라,
1KB를 "표현"하기 위해 필요한 비트 수를 말한다.
→ 즉, 비트 수는 "주소 개수", 바이트 수는 "가리키는 데이터 양"을 의미한다!
와 마침 햇갈리던 개념이었는데 고마워욤 맹쥐님 ~