메모리 구조
📋 문서 버전
이 문서는 5개의 버전이 있습니다. 현재 버전 4을 보고 있습니다.
메모리 구조
개요
메모리 구조(Memory Layout)는 컴퓨터 시스템에서 프로그램이 실행될 때 메모리가 어떻게 구성되고 사용되는지를 설명하는 개념이다. 프로그램이 메모리에 적재되면, 그 프로그램은 여러 영역으로 나뉘어 데이터와 코드를 저장하며, 각 영역은 특정 목적과 생명 주기를 가진다. 메모리 구조를 이해하는 것은 프로그래밍, 특히 시스템 프로그래밍, 성능 최적화, 보안 취약점 분석(예: 버퍼 오버플로우) 등에 매우 중요하다.
이 문서에서는 일반적인 프로세스 메모리 레이아웃을 구성하는 주요 영역들을 설명하고, 각 영역의 역할과 특징을 다룬다. 본 내용은 주로 유닉스 계열 운영체제와 C 언어 기반의 실행 환경을 기준으로 설명하되, 일반적인 원리는 대부분의 현대 운영체제에 공통적으로 적용된다.
메모리 레이아웃의 주요 구성 요소
프로세스가 실행될 때 운영체제는 해당 프로세스를 위한 가상 메모리 공간을 할당하며, 이 공간은 다음과 같은 주요 영역으로 나뉜다:
- 텍스트 영역 (Text Segment)
- 초기화된 데이터 영역 (Initialized Data Segment)
- 초기화되지 않은 데이터 영역 (BSS Segment)
- 힙 (Heap)
- 스택 (Stack)
이들 영역은 일반적으로 아래에서 위로 또는 위에서 아래로 확장되며, 힙과 스택은 서로 반대 방향으로 성장하여 메모리 공간을 효율적으로 사용한다.
텍스트 영역 (Text Segment)
- 용도: 프로그램의 실행 가능한 명령어(기계어 코드)를 저장하는 영역.
- 특징:
- 읽기 전용(read-only)이며, 실행 권한이 부여됨.
- 여러 프로세스가 동일한 프로그램을 실행할 경우, 이 영역은 공유될 수 있음 (예: 공유 라이브러리).
- 컴파일 시 결정되며, 실행 중에 변경되지 않음.
- 예시:
main()함수, 사용자 정의 함수 등의 기계어 코드.
int main() {
printf("Hello, World!\n"); // 이 코드는 텍스트 영역에 저장됨
return 0;
}
초기화된 데이터 영역 (Initialized Data Segment)
- 용도: 프로그램 시작 전에 값을 할당받은 전역 변수와 정적 변수를 저장.
- 특징:
.data섹션으로도 불림.- 읽기/쓰기 가능.
- 프로그램 로딩 시 메모리에 복사됨.
- 예시:
int global_var = 10; // 초기화된 전역 변수
static int static_var = 20; // 초기화된 정적 변수
초기화되지 않은 데이터 영역 (BSS Segment)
- 용도: 전역 또는 정적 변수 중 초기값이 지정되지 않은 변수를 위한 공간.
- 특징:
.bss섹션으로도 불림.- 프로그램 시작 시 자동으로 0으로 초기화됨.
- 실행 파일에는 크기 정보만 포함되며, 실제 데이터는 저장되지 않아 파일 크기 절약.
- 예시:
int uninitialized_global; // BSS 영역에 할당됨
static int static_uninit; // 마찬가지로 BSS
힙 (Heap)
- 용도: 동적 메모리 할당을 위한 영역. 프로그래머가 필요에 따라 메모리를 할당하고 해제.
- 특징:
[malloc](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/C%EC%96%B8%EC%96%B4/malloc)(),[calloc](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/C%EC%96%B8%EC%96%B4/calloc)(),[realloc](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/C%EC%96%B8%EC%96%B4/realloc)(),[free](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/C%EC%96%B8%EC%96%B4/free)()등의 함수를 통해 관리.- 수명 주기가 명시적으로 제어됨.
- 메모리 누수(Memory Leak)나 이중 해제(Double Free) 등의 문제가 발생할 수 있음.
- 아래에서 위로 확장됨 (일반적인 구현).
- 예시:
int *ptr = (int*)malloc(sizeof(int) * 100); // 힙에 메모리 할당
// 사용 후 반드시 free(ptr) 호출 필요
스택 (Stack)
- 용도: 함수 호출 시 지역 변수, 매개변수, 반환 주소 등을 저장.
- 특징:
- LIFO(Last In, First Out) 구조.
- 함수 진입 시 스택 프레임(Stack Frame)이 생성되고, 종료 시 자동 제거.
- 자동 변수(auto variables)와 함수 호출 정보 저장.
- 위에서 아래로 확장됨.
- 스택 오버플로우(Stack Overflow) 발생 가능 (예: 무한 재귀).
- 예시:
void func(int x) {
int local = x * 2; // local 변수는 스택에 저장됨
}
메모리 레이아웃 시각화
다음은 일반적인 프로세스 메모리 레이아웃의 시각적 표현이다:
높은 주소
+------------------+
| 스택 | ↓ 확장
+------------------+
| ... |
+------------------+
| ... |
+------------------+
| 힙 | ↑ 확장
+------------------+
| BSS 영역 |
+------------------+
| 데이터 영역 |
+------------------+
| 텍스트 영역 |
+------------------+
낮은 주소
관련 개념 및 주의사항
- 가상 메모리: 각 프로세스는 독립적인 가상 주소 공간을 가지며, 실제 물리 메모리와 매핑됨.
- 메모리 보호: 운영체제는 각 영역에 접근 권한을 설정하여 코드 영역의 수정을 방지하거나 스택/힙의 오버플로우를 감지.
- 보안 취약점: 버퍼 오버플로우는 스택 또는 힙 영역에서 발생하며, 공격자가 텍스트 영역의 실행 흐름을 조작할 수 있음.
참고 자료
- Silberschatz, A., Galvin, P. B., & Gagne, G. (2018). Operating System Concepts (10th ed.). Wiley.
- Tanenbaum, A. S. (2015). Modern Operating Systems (4th ed.). Pearson.
- Linux Programmer's Manual (
man 3 malloc,man 7 execve) - GNU C Library Reference Manual
이 문서는 컴퓨터 시스템의 메모리 구조에 대한 기초적인 이해를 제공하며, 시스템 프로그래밍 및 운영체제 학습의 기초 자료로 활용할 수 있다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.