메모리 저장 영역
프로그램이 실행되기 전에는 먼저 프로그램이 메모리에 로드되고, 프로그램에 사용되는 변수들도 로드되어야 합니다.
따라서, 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 영역을 제공하고 있습니다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같습니다.
1. 코드 영역
2. 데이터 영역
3. 스택 영역
4. 힙 영역
다음 그림은 운영체제가 제공하는 메모리 공간을 나타내고 있습니다.
각 영역에 대해 간단히 알아보면 다음과 같습니다.
코드 영역
프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 불립니다.
컴파일 이후에 기계어로 저장되며, 프로그램이 실행되고 끝날 때까지 메모리에 남습니다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가려가서 처리합니다.
데이터 영역
프로그램의 전역 변수와 정적 변수(static)가 저장되는 영역입니다.
프로그램 시작과 함께 할당되며, 프로그램이 종료하면 소멸합니다.
스택 영역
함수의 호출과 관계되는 지역 변수와 매개 변수가 저장되는 영역입니다.
스택 영역은 함수의 호출과 함께 할당되며, 함수가 종료되면 해제됩니다.
이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 합니다.
힙 영역
사용자가 직접 관리하는 메모리 영역입니다.
사용자에 의해 메모리 공간이 동적으로 할당되거나 해제됩니다.
메모리의 종류에는 정적 메모리와 동적 메모리가 있고, 할당에도 정적 할당과 동적 할당이 있습니다.
정적 메모리는 컴파일 시간 동안 할당된 메모리이며, 고정된 공간을 가지고 있고 런타임 때 그 크기를 변경할 수 없습니다.
위의 코드 영역과 데이터 영역이 이에 해당됩니다.
동적 메모리는 반대로 메모리 영역의 크기가 런타임 때 변할 수 있는 공간을 의미합니다.
위의 힙 영역과 스택 영역이 이에 해당됩니다.
정적 할당과 동적 할당에서도 정적과 동적의 의미는 메모리와 같지만 전체적인 의미는 조금 다릅니다.
정적 할당과 동적 할당을 구분 짓는 기준은 프로그램 실행 중에 메모리 공간을 할당하는가? 입니다.
정적 할당은 컴파일 단계에서 필요한 메모리 공간을 할당하고, 동적 할당은 런타임 때 할당합니다.
힙 영역은 동적 할당으로 이루어지는 동적 메모리 영역인 반면에, 스택 영역은 동적 메모리인 것은 맞지만 정적 할당으로 메모리 공간이 생성됩니다.
그 이유는 스택 영역은 할당은 컴파일 시간 때 이루어지지만, 메모리 영역은 함수의 호출이 종료됨에 따라 해제될 수 있는 가변성을 띄고 있기 때문입니다.
사용자가 프로그램을 실행하는 과정은 다음과 같습니다.
① 프로그램 실행을 요청(request)합니다.
② 프로그램의 정보를 읽어 메모리에 로드(load)합니다.
③ CPU는 프로그램 코드를 가져와 메모리를 관리하고 명령문(function, method)을 실행합니다.
④ Heap: 동적 메모리가 할당되면 FreeStore 영역을 사용합니다. (low memory -> high memory)
⑤ Stack: 동적 메모리가 할당되면 FreeStore 영역을 사용합니다. (high memory -> low memory)
Heap과 Stack은 공통된 FresStore 영역을 사용하기 때문에, FreeStore 영역을 넘어서 Heap이 Stack 영역을 침범하면 Heap Overflow라고 하고 Stack이 Heap 영역을 침범하면 Stack Overflow라고 합니다.
자료 출처
1. http://www.tcpschool.com/c/c_memory_structure
2. https://blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=eludien&logNo=221462352935