메모리 레이아웃
Memory Layout
이란 프로그램의 데이터와 코드가 메모리에 저장되는 방식이다. 메모리는 세그먼트(Segment)
라는 논리적 단위로 구분된다.
프로그램이 메모리에 로드되는 과정은 프로그램 실행 과정에서 확인해볼 수 있다.
구성 요소¶
Code Segment¶
텍스트 세그먼트라고도 불리는 해당 영역은 컴파일된 프로그램
이 위치한다. 읽기 전용이므로 프로그램이 수정되는 것을 방지한다.
Data Segment¶
데이터 세그먼트는 전역 변수
나 정적 변수
가 저장되는 공간이다. 때로는 초기화 여부를 구분하기 위해 Uninitialized Data Segment
와 Initialized Data Segment
로 구분하기도 한다. Uninitialized Data Segment
는 BSS(Block Started by Symbol)
라고도 부른다.
Heap Segment¶
구조체
나 객체
에 대한 메모리를 동적으로 할당하기 위해 사용된다. C나 C++의 경우 molloc
이나 new
키워드를 사용하여 메모리를 할당하면 포인터가 반환받는데, 이때 해당 주소는 할당된 Heap 영역의 주소이다.
Heap 영역은 사용하지 않는 경우 free()
나 delete
를 사용하여 해제해야 한다. 그렇지 않으면 메모리 누수가 발생할 수 있으며 프로그램의 성능 저하가 발생할 수 있다.
Stack Segment¶
지역변수
와 함수 매개변수
, 반환주소
가 후입선출(LIFO)
구조로 저장된다. 자료구조에서의 스택과 같이 데이터가 상단에서 추가되고, 상단에서 제거가 이루어진다. 보통 함수 호출을 위해 사용되는데, 재귀적으로 호출하는 경우 스택의 공간을 넘어서는 경우(Stack Overflow)가 발생할 수 있다.
스택은 스택 포인터(Stack Pointer, SP)
를 사용하여 스택의 상단 부분의 주소를 가리킨다. 함수의 호출로 인해 메모리 확장이 필요한 경우 SP는 감소하며, 메모리가 해제되는 경우 SP는 증가한다. 이때 함수의 상태 등을 추적하기 위해 Activation Record라는 데이터 구조로 스택에 저장된다.
참고문헌¶
Created : 14 mai 2023