In Veritate Libertas

The Restricted
Section

A collection of spells,
experiments, and forbidden knowledge.

Study/[ OS ] | 2026. 7. 6. 18:41

#10 주소 공간과 가상 메모리

728x90

주소 공간과 가상 메모리 — 프로세스는 메모리를 어떻게 보고 있어?

메모리 계층 파트에서 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에서 제일 중요한 추상화 중 하나야. "각 프로세스는 자기만의 메모리 공간을 가진다"는 이 개념이 멀티프로세스 환경에서 보호와 격리를 가능하게 해줘. 다음 파트에서 이 가상 주소가 물리 주소로 어떻게 변환되는지, 그 구체적인 메커니즘을 다룰게.

728x90

'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

공순이 흐이서