메모리의 구성

프로그램이 실행되기 위해서는 프로그램이 메모리에 로드(Load) 되어야 하며, 프로그램에서 사용되는 변수들은 저장할 메모리도 필요하다. 따라서 컴퓨터의 운영체제는 프로그램 실행 시 메모리 공간을 할당한다.

프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 4개의 영역으로 구분된다.

Untitled

이처럼 메모리 공간을 나누어 유사한 성향의 데이터를 묶어 저장하면 관리가 용이해지고 메모리 접근 속도가 향상된다.


메모리 영역별 저장 데이터

코드 영역 (Code Area)

실행할 프로그램의 코드와 매크로 상수가 저장되는 메모리 공간이다. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다. 텍스트 영역이라고도 불린다.

코드 영역에 할당되는 데이터들은 프로그램이 시작하고 종료될 때까지 메모리에 계속 남아있으며, 중간에 코드를 변경할 수 없게 Read_Only 로 지정되어있다.

데이터 영역 (Data Area)

프로그램의 전역 변수와 static 변수 등이 저장되는 영역이다. 전역변수와 static 변수를 참조한 코드는 컴파일 이후 데이터 영역의 주소값을 가르키도록 변경된다. 단, 초기화 되지 않은 전역 변수는 BSS 영역에 할당된다.

데이터 영역에 할당되는 데이터들은 프로그램이 시작하고 종료될 때까지 메모리에 계속 남아있으며, 중간에 변수가 변경 될 수도 있으니 Read-Write 로 지정되어있다.

스택 영역 (Stack Area)

메모리의 스택 영역은 함수의 호출과 관계되는 지역 변수와 매개 변수 등이 저장되는 영역이다. 스택 영역에 할당되는 데이터들은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.

스택 영역에 저장되는 함수의 호출 정보를 스택 프레임 (Stack Frame)이라고 하며 먼저 호출된 함수의 스택 공간일수록 늦게 해제되는 후입선출(LIFO) 방식으로 동작한다.

컴파일 타임에 크기가 결정되기 때문에 무한히 할당 할 수 없다. 따라서 재귀함수가 너무 깊게 호출되거나 함수가 지역 변수를 너무 많이 가지고 있어 스택 영역을 초과하면 Stcak Overflow 에러가 발생한다.

스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.

힙 영역 (Heap Area)

메모리의 힙 영역은 프로그래머가 원하는 시점에 변수를 할당하고, 소멸하도록 지원하는 공간이다. 힙 영역은 프로그래머에 의해 메모리 공간이 동적으로 할당되고 해제된다.

코드, 데이터, 스택 영역과는 다르게 힙 영역은 런타임에 결정 된다. 데이터 배열의 크기가 확실하지 않고 변동이 있을 때 힙 영역을 활용해서 메모리를 할당한다. 단, 사용하고 난 다음에는 반드시 해제를 해주어야 메모리 누수(Memory Leak)가 발생하지 않는다.

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

Untitled