프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 합니다.
또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요합니다.
따라서 운영체제(OS)는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있습니다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같습니다.
프로세스가 실행할 코드와 매크로 상수가 기계어의 형태로 저장된 공간이다.
컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only로 지정되어있다.
전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장된다.
1. 초기화 된 데이터는 data 영역에 저장되고
2. 초기화 되지 않은 데이터는 bss(Block Stated Symbol) 영역에 저장된다.
프로세스가 실행될 때 생성되고 프로세스가 종료되면 시스템에 반환된다.
함수 내부에 선언된 Static 변수는 프로세스가 실행될 때 공간만 할당되고, 그 함수가 실행될 때 초기화 된다.
data영역과 bss영역을 나누는 이유?
프로세스의 크기를 줄이기 위해서이다. 초기화 값은 ROM에 저장되는데 각각을 0으로 채워야하기 때문에 크기가 크게 증가하기 때문이다.
필요에 의해 동적으로 메모리를 할당하고자 할 때 위치하는 메모리 영역으로 메모리 주소 값에 의해서만 참조되고 사용되는 영역이다.
malloc
이나 new()
같은 함수를 통해 저장된다.
프로세스가 자동으로 사용하는 임시 메모리 영역이다.
지역변수, 매개변수, 리턴 값 등이 잠시 사용되었다가 사라지는 데이터를 저장하는 영역이다.
함수 호출 시 생성되고, 함수가 끝나면 시스템에 반환된다.
스택 사이즈는 각 프로세스마다 할당되지만, 프로세스가 메모리에 로드될 때 고정되므로 런타임 시에 스택 사이즈를 바꿀 수는 없다.
명령 실행시 자동 증가/감소 하기 때문에 보통 메모리의 마지막 번지를 지정한다.
참고사항
1. 컴파일 시에 크기가 결정되는 것은 코드, 데이터 영역
2. 런타임 시에 크기가 결정되는 것은 힙, 스택 영역
3. code, data, heap 영역은 하위 메모리부터 할당, stack은 상위 메모리부터 할당된다.