프로세스가 메모리를 할당받으면, 자신만의 방법으로 메모리를 관리하기 위해 이 공간들을 어떤 구조로 관리하는데, 이를 프로세스 주소 공간이라고 한다. 메모리는 한정되어 있기 때문에 프로세스는 다양한 방법으로 메모리를 절약하려고 시도한다.
전역 변수와 정적 변수는 데이터 영역의 BSS 영역에 저장된다.
지역 변수는 Stack 영역에 저장된다.
Stack은 생성과 동시에 크기가 정해진다.
Heap은 필요에 따라 동적으로 확장 혹은 축소를 하게 된다.
Stack에서 할당의 의미는 이미 생성되어 있는 Stack에 대해 포인터의 위치만 바꿔 주는 단순한 CPU Instruction이다.
반면 Heap에서의 할당은 요청된 chuck의 크기, 현재 메모리의 fragmentation 상황 등 다양한 요소를 고려하기 떄문에 더 많은 CPU Instruction이 필요하다.
따라서 Stack이 더 빠르다고 할 수 있다.
데이터를 공유하고 자료 구조의 특성을 활용하기 위해서다.
Code 영역 같은 경우 같은 프로그램 자체에서 모두 같이 사용하기 때문에 공유하여 관리하고, Stack 영역에서는 스택 구조의 특성을 활용하기 위해서이다.
또한 Data 영역에서는 전역 변수를 따로 저장해 프로그램의 여러 함수들에서 모두 참조할 수 있다.
스레드는 자신이 속하는 프로세스의 Stack 영역만 복사해서 가져오고, 나머지 Code 영역 Data 영역 Heap 영역은 공유하여 사용한다.
이 외에도 각 스레드는 스레드 로컬 스토리지(TLS)라는 고유한 데이터 영역을 가질 수 있다. 이는 각 스레드가 자신만의 전역 변수를 가질 수 있게 한다.
Stack 메모리 영역과 Heap 메모리 영역은 이름이 같은 자료구조와는 몇 가지 공통점이 있지만, 그렇다고 완전히 같은 개념은 아니다.
Stack 영역: 이 영역은 자료구조의 스택처럼 후입선출 방식으로 동작한다. 함수가 호출되면, 해당 함수의 지역 변수와 매개변수, 반환 주소 등이 스택에 쌓이고, 함수가 종료되면 그 정보는 제거된다. 즉, 가장 최근에 들어온 데이터가 가장 먼저 나가는 구조이다.
Heap 영역: 이 영역은 자료구조의 힙과는 다르게 동작한다. 자료구조의 힙은 자료의 우선순위에 따라 정렬되는 반면, 메모리의 힙 영역은 동적으로 메모리를 할당하고 해제하는 역할을 한다. 따라서 자료구조의 힙과는 직접적인 연관이 없다.
IPC의 Shared Memory 기법은, 말 그대로 두 개 이상의 프로세스가 메모리를 공유하는 방식이다. 이 공유 메모리는 일반적으로 프로세스의 힙 영역에 할당된다.
동적 할당: 힙 영역은 동적 메모리 할당을 위한 공간이다. 공유 메모리의 크기는 프로세스 간의 통신 요구 사항에 따라 다르므로, 이를 동적으로 할당받을 수 있는 힙 영역에 위치하는 것이 적합하다.
생명주기 관리: 공유 메모리는 생성된 후에는 여러 프로세스가 접근할 수 있으며, 모든 프로세스가 사용을 완료한 후에 해제된다. 이는 힙 영역의 메모리가 프로그래머에 의해 명시적으로 할당/해제되는 방식과 일치한다.
Stack은 생성과 동시에 크기가 정해진다.
Heap은 필요에 따라 동적으로 확장 혹은 축소를 하게 된다.
일반적으로 프로그램 사용자가 직접 스택과 힙의 크기를 수정하는 것은 불가능하다. 이들 영역의 크기는 운영체제의 메모리 관리 정책과 프로그램의 코드에 의해 결정되고 사용자는 그저 사용할 뿐이다.
그러나 고급 사용자나 관리자는 운영체제의 설정을 통해 이러한 값들을 변경할 수 있을 수 있다. 예를 들어, Linux에서는 'ulimit' 명령을 사용하여 프로세스의 스택 크기를 조정할 수 있다.