프로세스가 메모리를 할당받으면 자신만의 방법으로 메모리를 관리하기 위해 이 공간을 어떤 구조로 관리합니다. 이 구조를 프로세스 주소 공간이라고 합니다.
프로세스 주소 공간
- Stack 영역
- 함수의 호출과 관계되는 지역 변수와 매개변수가 저장
- 함수의 호출과 함께 값이 할당되고 함수의 호출이 완료되면 소멸
- 메모리의 높은 주소에서 낮은 주소 방향으로 할당
- 컴파일 시 크기가 결정
- 재귀 함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 stack 영역을 초과하면 stack overflow 오류가 발생
- Heap 영역
- 런타임에 크기가 결정되는 영역
- 사용자에 의해 공간이 동적으로 할당 및 해제
- 주로 참조형 데이터(클래스 등)가 할당
- 메모리의 낮은 주소에서 높은 주소 방향으로 할당
- Data 영역
- 전역 변수나 Static 변수 등 프로그램이 사용할 수 있는 데이터를 저장
- 어떤 프로그램에 전역/Static 변수를 참조하는 코드가 존재한다면 컴파일 후에 이 영역 참조
- 프로그램의 시작과 함께 할당, 종료와 함께 소멸
- 단, 초기화되지 않은 변수가 존재한다면 BSS 영역에 저장
- Text(Code) 영역
- 프로그램이 실행될 수 있도록 CPU가 해석 가능한 기계어 코드가 저장
- 프로그램이 수정되면 안 되므로 ReadOnly 상태
영역이 나눠진 이유
Stack 영역과 Data 영역
두 영역이 나눠진 이유는 역할의 분배때문입니다. Stack 영역을 통해 함수의 흐름을 관리하고 Data 영역을 통해 전역 변수, static 변수를 관리합니다.
Data 영역의 공유
한 프로세스에서 여러 개의 스레드를 갖는다면 그 스레드들은 Data 영역을 공유하게 됩니다. 같은 공간을 공유함으로써 메모리를 절약할 수 있습니다.