프로그램이 실행되기 위해서는 먼저 프로그램이 메모리(RAM)에 로드되어야 한다.
프로그램을 실행하게 되면 운영체제가 메모리(RAM)에 공간을 할당해준다.
RAM의 구조
- 코드(Code) 영역 : 실행할 프로그램의 코드
- 데이터(Data) 영역 : 전역 변수, 정적(static) 변수
- 힙(Heap) 영역 : 런타임 시에 크기가 결정(사용자의 동적 할당)
- 스택(Stack) 영역 : 컴파일 타임에 크기가 결정됨
코드(Code) 영역
- 작성한 코드가 저장되는 영역으로
텍스트 영역이라고도 함 - 기계어 형태로 저장
- 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로
함수,제어문,상수등이 여기에 저장 - CPU는 코드 영역에 저장된 명령어들을 하나씩 가져가서 실행
데이터(Data) 영역
전역 변수와정적(static) 변수가 할당되는 영역- 메인 함수 전에 선언되어 **프로그램 시작과 동시에 할당되고 프로그램 종료시에 메모리가 소멸
힙(Heap) 영역
- 이 영역에 메모리를 할당 하는 것을
동적 할당(Dynamic Memory Allocation)이라고 함 - 사용자에 의해 메모리 공간이 할당되고 해제됨
- 해제되지 않은 메모리(메모리 누수)는 운영체제에 의해서 자동으로 해제 되지만 프로그램의 성능을 크게 저하시킨다.
- 영역 중 유일하게 런 타임에 크기가 결정
스택(Stack) 영역
- 프로그램이 자동으로 사용하는 임시 메모리 영역
- 함수 호출 시 생성되는
지역 변수,매개 변수가 저장 됨 - 함수 호출이 완료되면 저장된 메모리도 해제 된다.
스택 영역과 힙 영역
⬇ 낮은 주소
+--------------------------+ | 코드 영역 (text) | +--------------------------+ | 데이터 영역 (data/bss) | +--------------------------+ | 힙 영역 (heap) | ← 위로 자람 (낮은 주소 → 높은 주소) | ↑ malloc/new | +--------------------------+ | | | (미사용 공간) | | | +--------------------------+ | ↓ 스택 | ← 아래로 자람 (높은 주소 → 낮은 주소) | 지역 변수 등 | +--------------------------+ ⬆ 높은 주소
- 스택과 힙은 중간에 미사용 공간을 가지고 있음
- 서로간의 충돌을 방지하기 위해 서로 다른 방향으로 자람 (스택 : 높은 주소 → 낮은 주소) (힙 : 낮은 주소 → 높은 주소)
- 힙/스택이 계속 커지게 되면 미사용 공간의 크기가 점점 줄어들게 되고 결국 서로 만나게 됨(Stack-Heap Collision)
스택 오버플로우(Stack Overflow)
- 스택이 자기 영역을 넘어서 커질 때 발생
- ex) 무한 재귀, 너무 큰 지역 배열
int Func(int a, b) //무한 재귀
{
return Func(a,b);
}
int main()
{
int arr[10000000000] //너무 큰 지역 배열
return 0;
}힙 오버플로우(Heap Overflow)
- 힙 메모리 자체에 할당은 되었는데 그 메모리의 경계를 넘어서 메모리를 사용하는 상황
char* str = new char[10]; strcpy(str, "엄청 긴 문자열");- 다른 데이터 손상, 보안 취약점