프로그램이 실행되기 위해서는 우선 프로그램이 메모리에 로드(load)되어야 한다. 또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.
따라서 운영체제는 프로그램의 실행을 위해 메모리 공간을 제공한다. 아래 그림은 프로그램이 운영체제로부터 할당받는 대표적인 메모리 영역을 표현한 그림이다.
실행할 프로그램의 코드가 저장되는 영역으로, 텍스트(Text) 영역이라고도 부른다. 이 코드는 기계어(바이너리 코드)로 저장된다. CPU가 이 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.
프로그램의 전역변수와 정적변수가 저장되는 영역이다. 데이터 영역은 프로그램의 시작과 함께 할당되고, 프로그램이 종료되면 제거된다. 따라서 프로그램 실행시, 전역변수와 정적변수는 메인 함수가 호출되기 전에 데이터 영역에 할당된다.
데이터 영역은 BSS 영역, Data 영역으로 나뉜다.
사용자에 의해 메모리 공간이 동적으로 할당(malloc)되고 해제(free)되는 영역으로, 사용자가 관리해야만 하는 메모리 영역이다. 힙 영역은 런타임 시, 동적으로 크기가 결정된다. 메모리의 낮은 주소에서 높은 주소 방향으로 할당된다.
함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역이다. 스택 영역은 프로그램 시작시 결정된다. 지역변수와 매개변수는 함수의 호출과 함께 할당되며, 함수 호출이 종료되면 제거된다. 메모리의 높은 주소에서 낮은 주소 방향으로 할당된다.
스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출하는 선형구조로 이루어져 있다. 이렇듯 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출된다. 쉽게 말하자면, 상자에 데이터를 쌓아 저장한다고 생각하면 된다. 가장 밑에 있는 것부터 바로 빼낼 수 없고, 위에 있는 것(가장 최근 데이터)부터 차례로 꺼낼 수 있다.
맨 처음 그림에서 보이듯 Heap과 Stack 영역은 같은 공간을 공유한다. 따라서 어느 한쪽이 커지면, 다른 한쪽은 작아진다.
힙 영역은 런타임 시 동적으로 그 크기가 결정되는 반면에, 스택 영역은 프로그램 시작 시, 즉, 컴파일 타임에 크기가 결정된다.