코드, 데이터, 힙, 스택 영역

2021. 10. 23. 17:01CS 지식

프로그램이 실행되면 운영체제는 메모리에 공간을 할당해준다.

이 메모리 공간은 크게 4개의 영역(segment)으로 나누어진다.

위쪽 영역일수록 메모리 주소의 값이 작다.

코드 영역
데이터 영역
힙 영역
스택 영역

 

 

코드 영역

프로세스가 실행할 코드와 매크로 상수가 기계어로 번역돼서(컴파일돼서) 저장된 공간이다.

컴파일 타임에 결정되고, 중간에 코드를 바꿀 수 없기 때문에 ro (read-only) 공간이다.

레지스터 eip를 통해 읽으며 프로그램이 실행된다.

 

데이터 영역

전역 변수 또는 static 변수 등이 저장된 공간.

데이터 영역은 data segment, bss, rodata로 공간이 나누어진다.

rodata 읽기 전용으로 초기화되는 영역 (const), 시스템 문자열 등
.bss (Block Started by Symbol) 초기화되지 않은 변수, main 실행 전 0으로 자동 초기화.
또는 0으로 초기화한 변수
.data 0이 아닌 값으로 초기화된 변수

그런데 const라고 꼭 rodata에 들어가는 것은 아니다. Visual Studio 컴파일러는 지역 const 변수를 스택영역에 할당했다.

 

힙 영역

다른 영역들과 달리 런 타임에 결정된다.

프로그래머가 필요할 때마다 사용된다.

데이터 배열의 크기가 확실하지 않고, 변동이 있을 때 사용한다.

이 공간을 할당하여 메모리를 사용한 후, 필수적으로 할당을 해제해야한다. (해제하지 않으면 memory leak 발생)

포인터로 메모리 영역에 접근해야하기 때문에,

스택에 비해 읽고 쓰는 것이 느리지만 할당 가능한 메모리 공간이 크다.

 

스택 영역

함수 안에서 선언된 지역변수, 매개변수, 리턴값, 돌아올 주소 등이 저장되고

함수 호출 시 기록하며 함수 종료 시 제거한다.

LIFO 메커니즘의 Stack 자료구조로 구현되어있다.

컴파일 타임에 크기가 결정되기 때문에 크기를 무한히 할당할 수 없다. (윈도우 기본 1M 제한)

제한된 크기를 넘을 시 스택오버플로우가 발생한다.

 

스택 영역은 메모리 주소가 큰 곳부터 할당되며,

다른 영역들은 메모리 주소가 작은 곳부터 할당된다.

그렇다고 꼭 차곡차곡 순서대로 값을 저장하는 것은 아니다.

 

출처: https://ko.wikipedia.org/wiki/동적_메모리_할당

 

'CS 지식' 카테고리의 다른 글

캐시 메모리  (0) 2021.11.08
메모리  (0) 2021.11.08
호출 규약  (0) 2021.10.25
endianness (엔디안)  (0) 2021.10.23
어셈블리 관련 정리(x86)  (0) 2021.10.15