Computer Science/OS

메모리 영역(Memory Segmentation)

궁선이 2019. 2. 3. 22:44

그저 저장소에 저장되어있는 데이터에 불과한 프로그램이 실행되기 위해서는 프로그램이 메모리에 LOAD되어 메모리 영역을 할당받아야 합니다.


이 때, 프로그램을 LOAD하고 메모리를 할당하는 작업은 OS에서 담당합니다.


 그리고 프로그램이 할당받는 메모리는 용도에따라 크게 4가지 영역으로 나뉘어 집니다.


CODE(TEXT), DATA, HEAP, STACK


4가지 메모리 영역을 좀 더 세분화한 그림입니다.


출처 : 위키피디아



1. CODE ( or TEXT) Segment


- Code영역 혹은 Text영역 이라고 불립니다.

- 실행할 프로그램의 기계어 코드가 저장됩니다.

- 읽기 전용 데이터 입니다.

- rodata: 프로그램에 사용되는 상수값 데이터들이 저장됩니다. (e.g 1, "Text", "\n", 29305)

- CONST: 전역변수의 초기 데이터들이 전역변수에 저장되기 전에 저장됩니다.


2. DATA Segment


- 전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장됩니다.

- 프로그램 시작과 동시에 할당되고, 프로그램 종료 시 메모리에서 소멸됩니다.

- DATA에는 초기화된 전역변수, BSS에는 초기화 값이 없는 전역변수가 저장됩니다.

- 함수 내부에 선언된 Static 변수는 프로그램이 실행 될 때 공간이 할당되며, 함수가 실행될 때 초기화 됩니다.


3. HEAP Segment


- 사용자에 의해 메모리 공간이 동적으로 할당되고 해제되는 영역입니다.

- 메모리 주소 값에 의해 참조가 가능합니다.

- 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.

- C언어의 경우 할당받은 힙 영역을 명시적으로 반환해주어야 합니다. 반환하지 않는다면 메모리 누수의 원인이 될 수 있습니다.

- 메모리 관리를 자동으로 해주는 언어의 경우는 Garbage Collector 가 자동으로 반환해주지만, GC가 성능 저하의 원인이 되기도 합니다.


4. STACK Segment


- 함수의 호출과 관계되는 지역변수, 매개변수, 리턴 값 등의 임시데이터들이 저장되는 영역입니다.

- 함수의 호출과 함께 생성이 되었다가 함수의 종료 시 시스템에 반환됩니다.

- LIFO(Last In First Out)의 구조입니다.

- 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.

- 할당된 스택의 크기는 고정이라 런타임 시에 변경할 수 없습니다.

- 이렇게 스택에 저장되는 함수의 호출 정보를 Stack Frame 이라고 합니다.