운영체제는 프로세스에 적절한 메모리를 할당하는데 다음 구조를 기반으로 할당합니다.
프로세스 메모리 영역
프로세스의 주소 공간은 코드(code), 데이터(data), 스택(stack), 힙(heap) 영역으로 구성된다.
이러한 주소 공간을 우리는 가상 메모리라고 부른다.
code 영역
- 사용자가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 공간
- 컴파일(compile) 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 되어있다.
data 영역
- 전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터를 저장하는 공간
- 데이터영역은 BSS영역과 Data영역으로 나뉘고, BSS영역은 초기화가 되지 않는 변수가 0으로 초기화되어 저장되며 DATA영역은 0ㅇ이 아닌 다른 값으로 할당된 변수들이 저장됩니다.
- 전역 변수 또는 static 값을 참조한 코드는 컴파일이 완료되면 data 영역의 주소값을 가르키도록 바뀐다. 전역변수가 변경 될 수도 있어 Read-Write로 되어있다.
stack 영역
-
스택에는 지역변수, 매개변수, 함수가 저장되고 컴파일 시에 크기가 결정되며 '동적'인 특징을 가집니다.
-
이 영역은 함수 호출시 기록하고 함수의 수행이 완료되면 사라진다. 메커니즘은 자료구조(stack)에서 배운 LIFO(Last In First Out) 방법을 따른다.
-
컴파일 시 stack 영역의 크기가 결정되기 때문에 무한정 할당 할 수 없다. 따라서 재귀함수가 반복해서 호출되거나 함수가 지역변수를 메모리를 초과할 정도로 너무 많이 가지고 있다면 stack overflow가 발생한다.
heap 영역
- 힙은 동적할당할때 사용되며 런타임 시 크기가 결정됩니다. 예를 들어 벡터같은 동적 배열은 당연히 힙에 동적할당 됩니다.
- 프로그래머가 필요할 때마다 사용하는 메모리 영역
- heap 영역은 런타임에 결정된다. 자바에서는 객체가 heap영역에 생성되고 GC에 의해 정리된다.
참고
https://zangzangs.tistory.com/107