OS 프로세스 데이터 영역
- 코드(Code) 영역:
- 프로그램의 기계어 명령어가 저장되는 영역입니다. 소스 코드를 컴파일하여 기계어로 변환한 후 이 영역에 저장됩니다.
- 프로그램 실행 동안 CPU가 이 영역에서 명령어를 가져와 실행하게 됩니다.
- 읽기 전용으로 설정되어 있으며, 프로그램이 끝날 때까지 메모리에 상주합니다.
- 데이터(Data) 영역:
- 초기화된 전역 변수와 정적(static) 변수가 저장됩니다.
- 전역 변수와 static 변수는 프로그램 시작 시 할당되며, 프로그램이 종료될 때까지 유지됩니다.
- 이 영역의 데이터는 프로그램이 시작할 때 값이 초기화되며, 메모리의 해당 위치는 프로그램 전체에서 참조 가능합니다.
- BSS 영역:
- 초기화되지 않은 전역 변수 및 정적 변수들이 저장되는 영역입니다.
- 이 변수들은 프로그램 시작 시 자동으로 0으로 초기화됩니다.
- BSS 영역은 초기화되지 않은 데이터만을 저장하므로 실제 실행 파일의 크기에 영향을 미치지 않습니다.
- 스택(Stack) 영역:
- 지역 변수, 함수의 매개변수 등이 저장되는 영역입니다.
- 함수 호출 시 스택에 할당되고, 함수가 종료되면 자동으로 해제됩니다.
- 스택은 LIFO(Last In, First Out) 구조로, 컴파일 타임에 크기가 정해지고 함수 호출 시 마다 스택 프레임이 추가 및 제거됩니다.
- 자동 할당 및 해제가 이루어지므로, 프로그래머가 직접 메모리 관리를 하지 않습니다.
- 스택 영역은 컴파일 타임에 영역 크기가 결정된다는 부분은 더 정확히 말하자면, 스택 자체의 최대 크기는 컴파일 시 결정될 수 있지만 스택 프레임의 크기와 위치는 함수가 호출될 때마다 런타임에 동적으로 관리됩니다.
- 힙(Heap) 영역:
- 동적 메모리 할당이 이루어지는 영역입니다.
- malloc(), calloc(), realloc(), free()와 같은 함수를 사용해 프로그래머가 직접 메모리 할당 및 해제를 제어해야 합니다.
- 런타임에 크기가 결정되며, 크기는 유동적입니다.
- 메모리 누수를 방지하기 위해서는 사용한 메모리를 적절히 해제해야 합니다.
#include <stdio.h>
#include <stdlib.h>
// Code 영역: 프로그램의 실행 코드를 저장
// 이 함수는 code 영역에 저장됨
void myFunction() {
printf("This is a function in the code section\n");
}
// Data 영역: 초기화된 전역 변수와 정적 변수가 저장되는 영역
// 전역 변수 (초기화됨, 데이터 섹션에 저장됨)
int initializedGlobalVar = 10;
// BSS 영역: 초기화되지 않은 전역 변수와 정적 변수가 저장되는 영역
// 전역 변수 (초기화되지 않음, BSS 섹션에 저장됨)
int uninitializedGlobalVar;
// Data 영역: 초기화된 정적 변수도 이곳에 저장됨
void someFunction() {
// 정적 변수 (초기화됨, 데이터 섹션에 저장됨)
static int staticInitializedVar = 5;
// BSS 영역: 초기화되지 않은 정적 변수는 BSS에 저장됨
static int staticUninitializedVar; // 초기화되지 않음
}
// Stack 영역: 함수 호출 시 지역 변수, 매개변수 및 리턴 주소가 저장되는 영역
// 함수가 호출되면 stack에 지역 변수 및 매개변수가 저장됨
int add(int a, int b) {
// 지역 변수 (stack에 저장됨)
int result = a + b;
return result;
}
int main() {
// Stack 영역: main 함수의 지역 변수는 stack에 저장됨
int localVariable = 0;
// Heap 영역: 동적으로 할당된 메모리는 heap에 저장됨
int *dynamicArray = (int *)malloc(5 * sizeof(int));
// 동적 메모리 사용
for(int i = 0; i < 5; i++) {
dynamicArray[i] = i * 10;
}
// 메모리 해제
free(dynamicArray);
// 전역 변수 사용
initializedGlobalVar += add(5, 3);
// 함수 호출 (stack 사용)
myFunction();
return 0;
}
각 메모리 영역의 설명:
- Code 영역:
- 프로그램의 실행 코드가 저장되는 영역입니다.
- 예:
myFunction()
함수와 같은 프로그램의 기계어 코드가 이 영역에 저장됩니다.
- Data 영역:
- 초기화된 전역 변수와 정적 변수가 저장됩니다.
- 예:
initializedGlobalVar
(전역 변수)나 staticInitializedVar
(정적 변수)처럼 초기화된 값이 있는 변수들이 이 영역에 저장됩니다.
- BSS 영역:
- 초기화되지 않은 전역 변수와 정적 변수가 저장됩니다.
- 예:
uninitializedGlobalVar
와 staticUninitializedVar
처럼 초기화되지 않은 변수가 이 영역에 할당됩니다.
- Stack 영역:
- 함수 호출 시 생성되는 지역 변수와 매개변수가 저장되는 영역입니다.
- 예:
add()
함수 내의 result
변수나 main()
함수의 localVariable
같은 지역 변수가 이 영역에 저장됩니다.
- Heap 영역:
- 동적으로 할당된 메모리가 저장되는 영역입니다.
malloc()
과 같은 함수를 통해 동적으로 메모리를 할당할 때 사용됩니다.
- 예:
dynamicArray
와 같은 동적 메모리 할당이 heap에 저장됩니다.