본문 바로가기
UNSEEN

UNSEEN 대비 3. 메모리 영역

by 니키티스 2024. 1. 25.
  • 해당 글은 UNSEEN 2기 코딩 테스트를 대비하여 정리 목적으로 적은 글입니다. 잘못된 부분이 있다면 지적해 주시면 감사하겠습니다.

3. 메모리 영역

메모리의 구조

프로그램이 실행되려면 먼저 프로그램을 메모리에 로드해야 한다.

프로그램 코드가 담고 있는 명령어와 프로그램 내에서 사용될 변수 등을 위해서 메모리가 필요하기 때문이다. 이때, 프로그램이 메모리에 탑재되어 실제로 실행되고 있는 것을 가리켜 프로세스라 부른다.

컴퓨터의 운영체제는 프로그램 실행을 위해 다양한 메모리 공간을 제공한다. 프로그램이 운영체제로부터 할당받는 메모리 공간은  대표적으로 4가지로 분류할 수 있다.

TCP School에서 가져온 메모리 영역 그림.

코드(code) 영역

메모리에 실행할 프로그램의 코드가 저장되는데 이를 메모리에서 코드 영역이라 부른다. 텍스트 영역이라고도 부른다.

CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다. 실제로 CPU에서 실행하는 명령어는 기계어이기 때문에, 여기서 말하는 코드도 컴파일러에 의해 변환된 기계어를 가리킨다.

데이터(data) 영역

메모리의 데이터 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다. 데이터 영역은 프로그램 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.

스택(stack) 영역

메모리의 스택 영역은 지역 변수와 매개 변수가 저장되는 영역이다.

스택 영역은 함수를 호출할 때 할당되고 함수가 반환될 때 소멸된다.

스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.

스택 영역은 푸시(push)로 데이터를 저장하고 팝(pop)으로 데이터를 인출한다. 스택은 후입선출(LIFO, Last-In First-Out) 방식으로 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출된다.

여기서 특징은 스택 영역과 다음에 설명할 힙 영역은 주소가 할당되는 방향이 반대라는 것이다. 스택 영역은 메모리의 높은 주소에서 낮은 주소로 할당된다.

따라서 스택에 4바이트짜리 정수 데이터를 푸시(push)하면, 그림과 같이 주소가 점점 감소하는 형태가 된다.

힙(heap) 영역

메모리의 힙 영역은 사용자가 직접 관리할 수 있고 관리해야 하는 메모리 영역이다.

힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

C언어와 C++ 언어에서는 이를 다르게 칭한다.

C에서는 동적으로 할당된 메모리를 힙(Heap)이라 부르는데, C++에서는 메모리를 new, free를 통해 할당 및 해제하므로 Free-Store라고 다르게 부른다.

다만 개념적인 차이이므로, 실제 메모리 영역을 힙과 Free-Store를 따로 관리하는 것은 아니니 참고만 하자.

// C Style(Heap)
int length = 10;
int* cptr = (int*)malloc(sizeof(int) * length);
free(cptr);

// C++ Style(Free-Store)
length = 10;
int* cpp_ptr = new int[length];
delete[] cpp_ptr;

코드로 힙(혹은 Free-Store)에 메모리를 할당하는 예시는 위와 같다.

앞에서도 말했지만, 힙 영역은 스택과 메모리를 할당하는 방향이 반대 방향이다. 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

오버 플로우

처음에 나온 그림. 잘 보면, 힙과 스택은 방향만 반대이지 서로를 향해 커진다.

앞의 그림을 보면 알겠지만 메모리 공간은 한정되어 있는데, 힙 영역과 스택 영역은 그 공간을 함께 나누어 사용한다. 그 때문에 메모리를 많이 할당하다 보면 서로의 영역을 침범하는 일이 발생하기도 한다.

이런 현상을 오버플로우, 즉 넘쳐흐른다고 부른다.

힙이 스택을 침범하는 경우를 힙 오버플로우(heap overflow)라 부르고, 스택이 힙을 침범하는 경우에는 스택 오버플로우(stack overflow)라 부른다.

개발자에게 가장 친숙한 사이트인 stackoverflow도 여기에서 이름을 따온 것이다.

출처

코딩의 시작, TCP School

[CS] 메모리 구조 (velog.io)

메모리의 구조 (코드, 데이터, 힙, 스택 영역) (tistory.com)

[C++] new/delete malloc/free 차이 (+ Free Store vs Heap) :: 엔지니어는 배가 고프다 (tistory.com)

C++ - 메모리 영역 - jacking75[

댓글