메모리 관리를 위한 도구로서의 VM - 할당과 회수의 비밀
개발자에게 메모리는 숫자와 주소가 뒤섞인 혼란의 세계일 수 있습니다. 하지만 운영체제와 가상 메모리 시스템은 이 복잡한 세계를
논리적이고 안전하며 효율적인 공간으로 정리해주죠.
이번 절에서는 CSAPP 9.4절을 바탕으로, 가상 메모리(Virtual Memory)가 어떻게 메모리 할당과 회수를 가능하게 해주는지 정리해 보겠습니다.
공간을 줄 수 있는 구조, 가상 메모리
가상 메모리는 프로세스에게 독립적인 주소 공간을 제공하며, 그 공간 안에서 스택과 힙을 자유롭게 확장하거나 줄일 수 있는 유연성을 제공합니다.
스택과 힙은 어떻게 VM 위에 구축될까?
힙(Heap)
- 동적 메모리 할당 (
malloc
,free
)이 일어나는 영역 - 아래에서 위 방향으로 확장
- 내부에서는 운영체제가
brk()
시스템 호출 등을 통해 힙 영역을 늘리거나 줄임
스택(Stack)
- 함수 호출, 지역 변수 저장 등에 사용
- 위에서 아래 방향으로 확장
- 함수 호출 시 스택 프레임이 생성되고, 복귀 시 파괴됨
구조 요약 (x86-64 가상 주소 기준)
// 높은 주소 //
───────────────────────────────
커널 영역 (사용자 접근 불가)
───────────────────────────────
[스택 영역] ↓ (함수 호출마다 쌓임)
...
───────────────────────────────
[빈 공간]
───────────────────────────────
[힙 영역] ↑ (malloc 시 확장)
───────────────────────────────
글로벌/정적 데이터 (.data, .bss)
───────────────────────────────
텍스트 (.text) — 코드 영역
// 낮은 주소//
이러한 구조 덕분에 스택과 힙은 충돌이 일어나지 않는 선에서 자유롭게 확장이 가능합니다.
malloc, free는 어떻게 동작할까?
malloc()
- 힙 영역에서 지정한 크기의 공간만큼 가상 주소 공간 상의 메모리 블록을 예약
- 실제 메모리 할당은 운영체제 요청(
sbrk
,mmap
)을 통해 이뤄짐 - 메모리 할당자는 내부에서 빈 블록 목록(Free List) 등을 유지하며 동작
free()
- malloc으로 얻은 블록을 다시 재사용 가능하도록 반환
- 실질적으로는 메모리를 제거하지 않고, 다시 사용할 수 있도록 표시
VM이 필요한 이유
- 힙 공간을 자유롭게 확장하려면 주소 공간을 조작할 수 있어야 함
- VM 덕분에 실제 물리 메모리를 건드리지 않고도 논리적으로만 공간 확보 가능
- 서로 다른 프로세스가 동일한 주소(예: 0x555555...)를 사용하더라도 충돌이 없음
메모리 회수의 주체
- 할당된 메모리는 사용자가
free()
를 호출해야 회수됨 - 사용하지 않고 남겨두면 메모리 누수(leak)가 발생
- OS는 프로세스가 종료될 때 전체 주소 공간을 회수하지만, 실행 중에는 사용자가 직접 관리해야 함
핵심 요약
- 힙은 malloc/free로 동작하며, 아래에서 위 방향으로 확장된다
- 스택은 함수 호출, 지역 변수 저장에 사용되며 위에서 아래 방향으로 확장된다
- 가상 메모리는 스택과 힙이 서로 충돌하지 않도록 논리적으로 분리된 공간을 제공한다
- malloc/free는 실제로는 가상 주소 공간에서 메모리를 확보하거나 재사용 가능 상태로 표시한다
- 메모리 누수는 사용자가
free()
호출을 빠뜨릴 때 발생하며, OS는 프로세스 종료 시에만 전체 메모리를 회수한다
'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글
[CSAPP 9장 완전 정복] 9.6 주소의 번역 - 가상 주소는 어떻게 물리 주소로 바뀔까? (0) | 2025.04.23 |
---|---|
[CSAPP 9장 완전 정복] 9.5 메모리 보호 - 가상 메모리가 제공하는 고립과 안전 (0) | 2025.04.22 |
[CSAPP 9장 완전 정복] 9.3 캐싱 도구로서의 VM(가상 메모리) - 지역성과 페이지 (0) | 2025.04.22 |
[CSAPP 9장 완전정복] 9.1~9.2 가상 메모리의 시작 - 주소와 주소 공간 이해하기 (0) | 2025.04.22 |
[CSAPP 8장 완전 정복] 8.7~8.8 프로세스 도구 실전 사용 + 8장 전체 요약 (0) | 2025.04.21 |