프로그램이 실행 될 때 메모리는 기계어 코드가 들어 있는 코드 섹션(Code Section)과
데이터를 저장하는 데이터 섹션(Data Section)으로 나뉜다.
데이터 섹션은 다시 3부분으로 나눠어 지며
전역 메모리(Global Memory)와
스택 메모리(Stack Memory), 그리고
힙 메모리(Heap Memory)가 바로 그것이다.
전역 메모리에는 모든 지역 함수(Local Function) 바깥에 선언된 변수(Global Variable)를 할당한다.
이 때 메인 함수는 운영체제가 프로그램 실행을 위해 최초로 호출하는 일종의 지역 함수로 구분된다.
스택 메모리는 함수 내에 선언된 지역 변수들을 위한 공간이다.
지역 변수는 필요한 공간의 크기를 컴파일 시에 확정한다. 함수 호출시 그에 해당하는 지역 변수를 위한 공간을 확보하며 해당 함수의 실행이 끝나게 되면 지역 변수의 공간을 자동으로 해제하게 된다.
힙 메모리의 경우 프로그램 실행시 일정량의 힙 메모리를 할당하게 되며 프로그램 실행 중 필요에 의한 동적 메모리 할당을 위한 공간이 힙 메모리이다. (C에서는 malloc,C++ 에서는 New 명령을 사용하여 메모리를 할당하게 된다.) 힙 메모리의 크기는 운영체제가 정한 최대 가상 메모리(Virtual Memory) 만큼이다.
프로그램의 메인 메모리 구조를 단순화 시켜 나타내면 다음과 같다.
높은 번지↓(High Address) |
힙(Heap)
|
|
미사용 공간(Available)
|
스택(Stack)
|
전역 변수(Global Variables)
|
낮은 번지↑(Low Address) |
기계어 코드(Machine Code)
|
미사용 공간(Available)은 스택의 정적으로 할당, 힙의 동적 할당에 따라 줄어 든다.
이 말의 의미는 처음부터 모든 스택과 힙 공간이 할당되어 있는 것이 아니라 동적이든 정적이든 함수의 호출로 인하여 메모리 공간이 필요한 시기에 할당된다는 의미이다.
------------------------------------------------------------------------------------------
1. Text (텍스트 영역)
program code (CPU에 의해서 수행되는 기계어 명령어들이 모여있는 곳)
2. Data (정적데이터 영역)
전역 변수와 정적(static) 변수가 할당된 곳. 프로그램 시작과 동시에 할당되고, 프로그램이 종료되어야만 메모리에서 소멸된다.
(1) initialized data segment (초기화된 데이터 영역) : initialized variables (초기화된 데이터 들이 모여있는 곳)
(2) uninitialized data segment (비 초기화된 데이터 영역) : uninitialized variables ( 초기화되지 않은 변수들이 모여있는 곳 )
- bss (block started by symbol) 라고도 한다
3. Stack (스택 영역)
automatically allocated variables (local variables) and other stack frame entries
지역변수와 매개 변수가 저장된 곳. 이 영역에 할당된 변수는 함수 호출이 완료되면 사라진다는 특징을 지닌다.
- 컴파일 타임 크기 결정
==> 추가 2010년 07월 26일
스택 영역은 SP(스택 포인터)를 베이스로 해서 스택함수(PUSH, POP)를 통하여 스택 영역에 데이터를 write한다. 즉 함수 호출이 되면 4개(시스템마다 다를수 있음)까지는 레지스터에 변수가 매핑이 되고 그 이후의 함수 파라미터들은 스택에 push 된 후 pop을 통하여 파리미터들을 전달 받는다.
또한 함수내부의 변수들만큼 스택에 push를 한다. 위 말에서 함수 호출이 완료되면 스택영역에서 사라진다는 말은 함수가 종료되어 필요하지 않은 변수들은 pop을 해서 sp를 감소시킨다는 것이다. 반대로 push는 sp를 증가시키는 것이다.
그리고 sp의 증가/감소는 시스템마다 다르다.
4. Heap (힙)
dynamically allocated variables
동적 메모리 할당을 위한 곳. 프로그래머가 할당 및 해제를 해 줘야 한다.
- 런 타임 크기 결정
출저: http://blog.naver.com/blueherald?Redirect=Log&logNo=120048956032
프로그래밍 공부하면서 꼭 알아둬야하는 메모리 영역
역시 프로그래밍은 블로그에 정리(퍼옴^^;;;;)하면서 공부하는 재미가 솔솔함