메모리 구조

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2026.04.10
조회수
31
버전
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)

  • 용도: 동적 메모리 할당을 위한 영역. 프로그래머가 필요에 따라 메모리를 할당하고 해제.
  • 특징:
  • <a href="/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" class="wiki-link wiki-link-missing">malloc</a>(), <a href="/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" class="wiki-link wiki-link-missing">calloc</a>(), <a href="/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" class="wiki-link wiki-link-missing">realloc</a>(), <a href="/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" class="wiki-link wiki-link-missing">free</a>() 등의 함수를 통해 관리.
  • 수명 주기가 명시적으로 제어됨.
  • 메모리 누수(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 생성 콘텐츠가 도움이 되었나요?