메모리 구조

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2026.04.10
조회수
12
버전
v4

📋 문서 버전

이 문서는 5개의 버전이 있습니다. 현재 버전 4을 보고 있습니다.

메모리 구조

개요

메모리 구조(Memory Layout)는 컴퓨터 시스템에서 프로그램이 실행될 때 메모리가 어떻게 구성되고 사용되는지를 설명하는 개념이다. 프로그램이 메모리에 적재되면, 그 프로그램은 여러 영역으로 나뉘어 데이터와 코드를 저장하며, 각 영역은 특정 목적과 생명 주기를 가진다. 메모리 구조를 이해하는 것은 프로그래밍, 특히 시스템 프로그래밍, 성능 최적화, 보안 취약점 분석(예: 버퍼 오버플로우) 등에 매우 중요하다.

이 문서에서는 일반적인 프로세스 메모리 레이아웃을 구성하는 주요 영역들을 설명하고, 각 영역의 역할과 특징을 다룬다. 본 내용은 주로 유닉스 계열 운영체제와 C 언어 기반의 실행 환경을 기준으로 설명하되, 일반적인 원리는 대부분의 현대 운영체제에 공통적으로 적용된다.


메모리 레이아웃의 주요 구성 요소

프로세스가 실행될 때 운영체제는 해당 프로세스를 위한 가상 메모리 공간을 할당하며, 이 공간은 다음과 같은 주요 영역으로 나뉜다:

  1. 텍스트 영역 (Text Segment)
  2. 초기화된 데이터 영역 (Initialized Data Segment)
  3. 초기화되지 않은 데이터 영역 (BSS Segment)
  4. (Heap)
  5. 스택 (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 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?