Skip to content

메모리 레이아웃

Memory Layout이란 프로그램의 데이터와 코드가 메모리에 저장되는 방식이다. 메모리는 세그먼트(Segment)라는 논리적 단위로 구분된다.

프로그램이 메모리에 로드되는 과정은 프로그램 실행 과정에서 확인해볼 수 있다.

메모리 레이아웃

구성 요소

Code Segment

텍스트 세그먼트라고도 불리는 해당 영역은 컴파일된 프로그램이 위치한다. 읽기 전용이므로 프로그램이 수정되는 것을 방지한다.

Data Segment

데이터 세그먼트는 전역 변수정적 변수가 저장되는 공간이다. 때로는 초기화 여부를 구분하기 위해 Uninitialized Data SegmentInitialized Data Segment로 구분하기도 한다. Uninitialized Data SegmentBSS(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라는 데이터 구조로 스택에 저장된다.

참고문헌


Last update : 23 mai 2023
Created : 14 mai 2023