프로그램이 실행되는 동안 운영 체제는 프로세스에 주소 공간을 할당하며, 이 공간은 크게 코드, 데이터, 힙, 스택 영역으로 구분된다. 각 영역은 프로그램의 다양한 데이터와 명령어를 저장하고 처리하는 데 특화된 역할을 한다.
초기화되지 않은 전역 변수와 정적 변수(static variables)는 BSS(Block Started by Symbol) 세그먼트에 저장된다. 이 세그먼트는 프로그램의 시작 시점에 0으로 초기화되며, 이는 메모리를 효율적으로 사용하기 위한 방법이다. BSS 세그먼트의 사용으로 인해 프로그램의 실행 파일 크기를 줄일 수 있으며, 실제 메모리는 프로그램이 실행될 때 할당된다.
스택은 주로 함수의 호출과 반환, 지역 변수의 저장에 사용된다. 스택의 크기는 대부분의 운영 체제에서 프로세스당 사전에 정의된 최대 크기를 가지며, 이 크기는 컴파일 시나 프로세스 시작 시 결정된다. 스택 오버플로우는 스택의 크기를 초과하는 경우 발생하며, 프로그램의 심각한 오류로 이어질 수 있다.
힙은 동적 메모리 할당에 사용되며, 그 크기는 실행 시간에 프로그램의 요구에 따라 변화한다. 힙의 최대 크기는 시스템의 물리적 메모리와 가상 메모리의 크기에 의해 결정된다. 힙의 메모리 관리는 프로그래머의 책임이며, 힙 오버플로우나 메모리 누수는 메모리 관리가 잘못되었을 때 발생한다.
스택은 컴퓨터의 메모리 구조상 빠르게 접근할 수 있는 LIFO(Last In, First Out) 구조를 가진다. 함수 호출과 같은 구조적인 동작에 최적화되어 있어, 스택 메모리에 접근하는 속도는 매우 빠르다.
힙은 스택보다 접근 속도가 느릴 수 있다. 이는 힙이 동적 메모리 할당을 위해 사용되며 메모리의 할당과 해제 과정에서 추가적인 계산이 필요하기 때문이다. 또한, 메모리 단편화와 같은 현상으로 인해 성능 저하가 발생할 수 있다.
프로세스 주소 공간의 세분화는 프로그램의 효율적인 실행을 위한 필수적인 구조적 접근 방식이다.