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

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 |