#10 주소 공간과 가상 메모리
주소 공간과 가상 메모리 — 프로세스는 메모리를 어떻게 보고 있어?
메모리 계층 파트에서 RAM이 뭔지 다뤘어. 이번엔 그 RAM을 여러 프로세스가 어떻게 나눠 쓰는지, 그리고 프로세스가 메모리를 어떻게 바라보는지를 파보자. 가상 메모리는 OS에서 제일 중요한 개념 중 하나야.
초기 컴퓨터의 메모리 — 한 번에 하나만
컴퓨터가 처음 나왔을 때는 메모리 구조가 단순했어.

OS가 메모리 앞부분을 쓰고, 나머지 공간에 프로그램 하나가 통째로 올라가는 구조야. 문제가 명확해 — 한 번에 프로그램 하나만 실행할 수 있어. 비싼 하드웨어인데 활용률이 낮아.
멀티프로그래밍 — 여러 프로그램을 메모리에
그래서 여러 프로세스를 동시에 메모리에 올리는 방식이 등장했어.

Process A, B, C가 동시에 물리 메모리에 올라가 있어. 근데 여기서 두 가지 문제가 생겨.
첫째, 보호 문제 — Process A가 실수로(혹은 악의적으로) Process B의 메모리 영역을 건드릴 수 있어. 이건 안전 문제야.
둘째, 주소 문제 — Process A는 자기 코드 안에 메모리 주소를 써놨는데, 이 주소가 물리 메모리의 어느 위치에 올라가느냐에 따라 달라져. 매번 다른 위치에 올라가면 코드 안의 주소를 전부 다시 계산해야 해.
이 두 가지 문제를 해결하기 위해 주소 공간(Address Space) 개념이 나왔어.
주소 공간 (Address Space)
프로세스가 사용할 수 있는 가상의 메모리 공간이야. 각 프로세스는 자기만의 독립적인 주소 공간을 가져.

주소 공간은 세 영역으로 나뉘어.
Code 영역 — 프로그램 코드가 저장돼. 읽기 전용이야.
Heap 영역 — new로 동적 할당한 객체들이 여기 들어가. 위로 자라. (↓ 방향)
Stack 영역 — 함수 호출 시 생성되는 지역 변수, 매개변수가 들어가. 아래로 자라. (↑ 방향)
이미지처럼 Heap은 낮은 주소 → 높은 주소 방향으로 자라고, Stack은 높은 주소 → 낮은 주소 방향으로 자라. 둘이 만나면 Heap Overflow나 Stack Overflow가 발생해. 무한 재귀 호출을 하면 Stack이 Heap 쪽으로 자라다가 터지는 게 이 이유야.
면접 포인트 ( •̀ ω •́ )✧
Q. 주소 공간이란?
각 프로세스에게 주어지는 독립적인 가상 메모리 공간이야. 0번부터 시작하는 가상 주소를 써서, 물리 메모리 어디에 올라가든 동일하게 동작하고 다른 프로세스 영역을 침범할 수 없어.
Q. 주소 공간의 세 영역은?
Code 영역(프로그램 코드, 읽기 전용), Heap 영역(동적 할당, 낮은 주소 → 높은 주소 방향 성장), Stack 영역(지역 변수/함수 호출, 높은 주소 → 낮은 주소 방향 성장).
가상 주소 vs 물리 주소
각 프로세스는 0번부터 시작하는 가상 주소 공간을 가져. 실제 물리 메모리 어디에 올라가든 상관없이 프로세스는 항상 자기 주소가 0부터 시작한다고 생각해.
Process A가 보는 세계: 실제 물리 메모리:
0 KB → Program Code 320 KB → Program Code (A)
1 KB → Heap 321 KB → Heap (A)
63 KB → Stack 383 KB → Stack (A)
Process A의 가상 주소 0KB가 물리 메모리의 320KB에 매핑돼 있어.

프로세스 A는 자기 코드에서 주소 0KB를 참조해도 돼. OS가 그걸 실제 물리 주소 320KB로 변환해줘. 이 변환이 주소 변환(Address Translation)이야.
덕분에 두 가지 문제가 해결돼.
- 보호: 각 프로세스가 자기 주소 공간 밖을 접근하면 OS가 막아
- 유연성: 프로그램을 물리 메모리 어디에 올려도 동일하게 동작해
면접 포인트 ( •̀ ω •́ )✧
Q. 가상 주소와 물리 주소의 차이는?
가상 주소는 프로세스가 사용하는 주소고, 물리 주소는 실제 RAM의 주소야. OS가 하드웨어(MMU)와 함께 가상 주소를 물리 주소로 변환해줘.
가상 메모리 (Virtual Memory)
주소 공간 개념을 더 확장한 게 가상 메모리야.
핵심 아이디어는 이래 — 프로세스 전체가 물리 메모리에 올라가 있지 않아도 실행할 수 있어.
실제로 프로그램을 실행할 때 전체 코드 중 당장 필요한 부분만 물리 메모리에 올리고, 나머지는 디스크(SSD/HDD)에 두는 거야.
가상 주소 공간 (Process가 보는 것)
┌─────────────────┐ 0KB
│ Program Code │ ← 물리 메모리에 있음
├─────────────────┤
│ Heap │ ← 물리 메모리에 있음
├─────────────────┤
│ free │
├─────────────────┤
│ Stack │ ← 물리 메모리에 있음
└─────────────────┘ 64KB
일부 페이지는 디스크에 → 필요할 때 물리 메모리로 올림
이게 가능한 이유가 있어 — CPU 스케줄링 파트에서 봤듯이 프로세스는 지역성(Locality) 특성을 가져. 특정 시점에 자주 접근하는 코드/데이터가 한정되어 있어서, 전체를 올려두지 않아도 대부분 잘 동작해.
가상 메모리의 장점
- 물리 메모리보다 큰 프로그램도 실행 가능 — 필요한 부분만 올리니까
- 더 많은 프로세스를 동시에 실행 가능 — 각 프로세스가 물리 메모리를 덜 차지하니까
- 프로세스 간 메모리 보호 — 각자 독립적인 가상 주소 공간이라 다른 프로세스 영역 접근 불가
처음엔 "디스크에서 가져오면 느리지 않아?" 싶었는데, 맞아. 물리 메모리에 없는 걸 접근하면 Page Fault가 발생하고 디스크에서 가져오는데, 이게 오래 걸려. 그래서 어떤 걸 물리 메모리에 유지할지 결정하는 페이지 교체 알고리즘이 중요해 — 이건 다음 파트에서 다룰 거야.
면접 포인트 ( •̀ ω •́ )✧
Q. 가상 메모리란?
프로세스 전체가 물리 메모리에 올라가 있지 않아도 실행할 수 있게 하는 기법이야. 당장 필요한 부분만 물리 메모리에 올리고 나머지는 디스크에 둬. 물리 메모리보다 큰 프로그램도 실행 가능하고, 더 많은 프로세스를 동시에 올릴 수 있어.
가상 메모리는 OS에서 제일 중요한 추상화 중 하나야. "각 프로세스는 자기만의 메모리 공간을 가진다"는 이 개념이 멀티프로세스 환경에서 보호와 격리를 가능하게 해줘. 다음 파트에서 이 가상 주소가 물리 주소로 어떻게 변환되는지, 그 구체적인 메커니즘을 다룰게.
'Study > [ OS ]' 카테고리의 다른 글
| #12 Segmentation (0) | 2026.07.15 |
|---|---|
| #11 주소 변환(Address Translation) (0) | 2026.07.15 |
| #09 교착상태 (DeadLock) (0) | 2026.07.06 |
| #08 동기화(뮤텍스, 세마포어, 스핀락) (0) | 2026.07.02 |
| #07 PCB & Context Switching (0) | 2026.07.02 |
흐이서
Writer공순이 흐이서
