
프로세스 메모리 구조
프로그램이 실행되면 OS는 해당 프로세스에 메모리 공간을 할당한다. 이 공간은 크게 4개 영역으로 나뉜다.
1. Code / Text 영역 (주소 : 낮은 곳, 0번지 쪽)
실행할 기계어 코드(명령어)가 저장되는 영역
- 컴파일된 프로그램의 실제 명령어들이 위치
- Read-Only로 보호됨 → 실행 중 코드 변경 방지
- 크기가 컴파일 타임에 고정됨
int main() {
printf("hello"); // 이 명령어들이 Code 영역에 올라감
}
2. Data 영역
전역 변수, 정적(static) 변수가 저장되는 영역이다.
- 프로그램 시작 시 할당, 종료 시 해제
- 두 가지로 세분화 됨:
- BSS (Block Started by Symbol) : 초기화되지 않은 전역/정적 변수
- Data (initialized) : 초기값이 있는 전역/정적 변수
int global = 10; // Data 영역 (초기화 O)
static int count; // BSS 영역 (초기화 X, 자동으로 0)
3. Heap 영역
런타임에 동적으로 할당되는 영역이다.
- 프로그래머가 직접 malloc, new 등으로 할당하고 free, delete로 해제
- 주소가 낮은 곳 → 높은 곳 (위쪽 방향) 으로 증가
- 해제하지 않으면 메모리 누수(Memory Leak) 발생
int *arr = malloc(sizeof(int) * 100); // Heap에 할당
free(arr); // 반드시 해제
4. Stack 영역 (주소: 높은 곳, max 쪽)
지역 변수, 함수 호출 정보가 저장되는 영역이다.
- 함수 호출 시 Stack Frame 단위로 쌓이고, 반환 시 자동 해제
- 주소가 높은 곳 → 낮은 곳 (아래쪽 방향) 으로 증가
- 크기가 제한 적 → 재귀 무한 호출 시 Stack Overflow 발생
void func() {
int local = 5; // Stack에 할당, 함수 종료 시 자동 해제
}
Stack ↕ Heap 구조의 핵심
이미지에서 핵심 포인트는 화살표의 방향이다.

Stack은 높은 주소부터 아래쪽으로 성장, Heap은 낮은 주소부터 위쪽으로 성장한다.
Stack과 Heap은 서로를 향해 성장하며 같은 여유 공간을 공유한다.
둘이 맞닿으면 Stack Overflow 또는 Heap Overflow가 발생한다.
정리
| 영역 | 저장 대상 | 할당 시점 | 해제 시점 | 성장 방향 |
| Code | 명령어 | 로드 시 | 프로세스 종료 | 고정 |
| Data | 전역/정적 변수 | 프로그램 시작 | 프로세스 종료 | 고정 |
| Heap | 동적 할당 | malloc / new | free / delete | ↑ 위쪽 |
| Stack | 지역 변수, 함수 호출 | 함수 호출 | 함수 반환 | ↓ 아래쪽 |
'CS 공부 > OS' 카테고리의 다른 글
| [OS] Ubuntu vs Rocky Linux (0) | 2026.07.16 |
|---|---|
| DAS, NAS, SAN 이해하기 (1) | 2026.07.13 |
| 디스크 여러 개를 하나처럼 — RAID 이해하기 (0) | 2026.07.13 |