프로그램이 실행되기 위해서는 먼저 프로그램이 메모리(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, "엄청 긴 문자열");
  • 다른 데이터 손상, 보안 취약점