둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (218) N
    • BOJ (171) N
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (30)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (13)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
      • 누적합 (5) N
    • 자료구조 (14)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (1)
      • 힙 (1)
      • 정렬 (1)
    • C++ (11)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (6)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • STL C++
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

변수들이 메모리에 저장되는 영역
OS

변수들이 메모리에 저장되는 영역

2025. 6. 23. 20:27

변수들이 메모리에 저장되는 영역에 대해서

프로그램이 실행될 때 변수와 코드들은 운영체제로부터 할당받은 메모리 공간에 저장되며, 이 메모리는 용도에 따라 여러 영역으로 나뉩니다. 대표적으로 다음과 같은 영역들이 있습니다:


1. Text (Code) 영역

  • 컴파일된 기계어 명령어가 저장되는 영역입니다.
  • 함수의 실제 동작 코드들이 이곳에 위치하며, 일반적으로 읽기 전용입니다.
  • 프로그램이 실행되는 동안 항상 메모리에 상주합니다.

2. rodata (Read-Only Data) 영역

  • 읽기 전용 상수 데이터가 저장되는 구역입니다.
  • 예를 들어 문자열 리터럴("Hello")이나 const로 선언된 전역 상수 등이 여기에 저장됩니다.
  • 수정이 불가능하며, 수정 시 런타임 오류(segmentation fault)가 발생할 수 있습니다.

3. Data 영역

  • 초기화된 전역변수나 static 변수가 저장됩니다.
  • 예: int g = 10;, static int s = 5;
  • 프로그램 시작 시 할당되고, 종료 시 해제됩니다.

+ BSS 영역

  • 초기화되지 않은 전역/정적 변수는 BSS 영역에 저장됩니다.
  • 이 영역은 실제 바이너리에서는 공간만 예약되고, 런타임에서 0으로 초기화됩니다.
  • 예: static int x;, int globalVar; (초기값 없음)

4. Heap 영역

  • 동적 메모리 할당 (malloc, new)에 사용되는 공간입니다.
  • 런타임 중에 크기를 지정할 수 있으며, 개발자가 명시적으로 해제 (free, delete)해야 합니다.
  • 메모리는 낮은 주소에서 높은 주소 방향으로 확장됩니다.
  • 메모리 누수나 단편화가 발생할 수 있으므로 신중하게 관리해야 합니다.

5. Stack 영역

  • 함수 호출 시 생성되는 지역 변수, 매개변수, 리턴 주소 등이 저장됩니다.
  • Stack의 "리턴 주소"에 대한 더 자세한 글은 여기 참고.
  • 함수가 종료되면 자동으로 해당 메모리는 해제됩니다 (LIFO 구조).
  • 높은 주소에서 낮은 주소 방향으로 확장됩니다.
  • 일반적으로 운영체제가 고정된 크기로 스택을 할당하며, 초과 시 스택 오버플로우가 발생할 수 있습니다.

📌 예제 코드로 구분 정리

 
#include <iostream>
#include <cstdlib>

const int const_global = 42;        // rodata (읽기 전용 데이터 영역)
int init_global = 100;              // data (초기화된 전역 변수)
int uninit_global;                  // bss (초기화되지 않은 전역 변수)

void exampleFunction() 
{
    int local_var = 10;             // stack (지역 변수)
    static int static_var = 5;      // data (초기화된 static 변수)
    static int uninit_static;       // bss (초기화되지 않은 static 변수)

    int* dynamic_var = new int(20); // heap (new로 동적 할당)

    const char* str = "Hello";      // rodata (문자열 리터럴)

    delete dynamic_var; // heap 메모리 해제
}

int main() 
{
    exampleFunction();
    return 0;
}
저작자표시 (새창열림)

'OS' 카테고리의 다른 글

파편화 (Fragmentation)  (0) 2025.06.24
동기화 객체란?  (0) 2025.06.23
데드락(Deadlock)이란?  (0) 2025.06.23
임계영역(Critical Section) 이란?  (0) 2025.06.23
함수 호출의 리턴 주소는 어떻게 스택에 저장될까?  (0) 2025.06.23
    'OS' 카테고리의 다른 글
    • 동기화 객체란?
    • 데드락(Deadlock)이란?
    • 임계영역(Critical Section) 이란?
    • 함수 호출의 리턴 주소는 어떻게 스택에 저장될까?
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바