
프로그램 실행 시 운영체제는 프로그램을 동작하기 위한 메모리 공간을 할당한다.
프로그램이 실행되는 동안 CPU가 코드를 처리하기 위해서는 메모리가 명령어와 데이터들을 저장하고 있어야 한다.
프로그램이 운영체제로부터 할당받는 메모리 공간은 코드 영역 (code), 데이터 영역 (data), 힙 영역 (heap), 스택 영역 (stack)으로 나뉘어져 있다.
코드 영역은 실행할 프로그램의 코드가 저장되는 영역으로, 텍스트 (Text) 영역이라고도 불린다.
컴파일된 기계어가 저장되어 있으며, 중간에 코드를 변경할 수 없게 Read-Only로 지정되어 있다.
CPU는 해당 메모리 영역에 저장된 명령어를 하나씩 가져가서 처리한다.
코드 영역은 프로그램이 시작하고 종료될 때까지 계속 남아있는 메모리이다.
데이터 영역은 전역 변수, 정적 변수, 문자열 상수 등이 할당되는 영역이다.
전역 변수나 정적 변수를 참조한 코드는 컴파일 이후 데이터 영역의 주소값을 가리키도록 변경된다.
실행 도중 전역 변수가 변경될 가능성이 있기 때문에 Read-Write로 지정되어 있다.
메인 함수 이전에 선언되어 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리가 소멸한다.
BSS와 GVAR 영역을 통틀어 데이터 영역이라고 지칭한다.
BSS (Block Started by Symbol)
초기화가 되지 않은 데이터를 저장하기 위한 영역
초기화되지 않은 데이터는 값을 저장하고 있을 필요가 없기 때문에 휘발성 메모리인 RAM에 저장한다.
BSS 영역에 변수들이 많아져도 프로그램의 실행 코드 사이즈는 늘어나지 않는다.
GVAR (Global VARiable)
초기화가 된 데이터를 저장하기 위한 영역
초기화된 데이터는 값을 저장해야하기 때문에 비휘발성 메모리인 ROM에 저장한다.
프로그램이 자동으로 사용하는 임시 메모리 영역으로, 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역이다.
이 때, 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임 (Stack Frame) 이라고 한다.
스택 영역의 크기는 컴파일 시에 결정된다.
함수 호출이 완료되면 스택 영역에 저장된 메모리도 해제된다.
메모리의 높은 주소부터 할당하는 후입선출 (Last In First Out) 구조를 가지고 있다.
스택 영역에서 푸시 (push) 를 통해 데이터를 저장하고, 팝 (pop) 을 통해 데이터를 인출한다.
사용자에 의해 메모리 공간이 동적으로 할당되고 해제되는 메모리 영역으로, 참조형 (Reference) 데이터 타입을 갖는 객체 및 배열 등이 저장되는 영역이다.
단, 힙 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 스택 영역에 저장된다.
응용 프로그램이 종료될 때까지 메모리가 유지되기 때문에 사용하고 난 뒤 반드시 메모리 해제가 이루어져야 한다.
메모리 해제를 하지 않는 경우 메모리 누수 (Memory Leak) 현상이 발생한다.
메모리 영역 중 유일하게 런타임 시에 크기가 결정되는 영역이다.
메모리의 낮은 주소부터 할당하는 선입선출 (First In First Out) 구조를 가지고 있다.
힙 영역에 메모리를 할당하는 것을 동적 할당 (Dynamic Memory Allocation) 이라고 부른다.
스택 영역과 힙 영역은 같은 공간을 공유하고 있다. 같은 메모리 공간을 힙 영역이 위쪽 주소부터, 스택 영역이 아래쪽 주소부터 할당하는 형식이기 때문에 각 영역이 상대 공간을 침범하는 오버플로우 (Overflow)가 발생할 수 있다.
이 때, 힙 영역이 스택 영역을 침범하는 경우를 힙 오버플로우 라고 하며, 스택 영역이 힙 영역을 침범하는 경우를 스택 오버플로우 라고 한다.