이야기박스

메모리 영역(Code, Data, Heap, Stack) 본문

Computer & Data/Operating System

메모리 영역(Code, Data, Heap, Stack)

박스님 2017. 11. 24. 15:57
반응형

이게 매번 헷갈려서 확실히 정리를 할 필요가 있겠네요. 


프로세스가 차지하고 있는 메모리를 살펴보면

크게 Code, Data, Heap, Stack의 영역으로 나누어져 있습니다.

이들 각각을 segment라 불러요.



- 메모리 맵


○ 정적 세그먼트

1. Code

: 제일 아래 text가 코드 부분입니다.

작성한 코드가 들어가는 부분입니다.  기계어도 포함되요. 

이 부분은 "read only" 영역이라 쓰기 작업이 들어오면 "access violation"이 발생합니다.

프로세스가 종료될 때까지, 계속 유지되는 영역입니다.



2. Data

전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장됩니다.

1) 초기화 된 데이터 : data에 저장

2) 초기화 되지 않은 데이터 : bss(Block Stated Symbol)에 저장


==> 사실 bss도 초기화를 함. 단, 값을 초기화 하는 것이 아니라, 메모리 상의 공간을 초기화 시키는 것.

그렇기 때문에, bss를 사용하는게 메모리 공간적으로 보면 더 효율적이라 할 수 있다.

==> 정리하자면, data 영역이 런타임 이전에 초기화 하는 것이라면, bss는 런타임 이후 초기화 하는 것


이 영역 또한 프로세스의 종료까지 유지됩니다.


* 함수 내 (심지어 main 함수도 포함) 변수들은 여기에 해당되지 않아요!
    --> Stack segment




○ 동적 세그먼트

3. Heap

프로그래머 동적으로 사용하는 영역입니다.

malloc, free 또는 new, delete 에 의하여 할당, 또는 반환되는 영역이지요.

자바나 c++과 같이 garbage collector가 활동하는 경우, 자동으로 반환되는 경우도 있습니다.



4. Stack

지역변수, 매개변수, 복귀 번지 등이 저장되어 있는 프로그램이 자동으로 사용하는 임시 메모리입니다.

함수 호출 시 생성되고, 함수 종료시 반환됩니다. 

그리고 Stack으로부터 유추 가능하듯이 Last In First Out 정책을 사용합니다.

마지막으로 다른 세그먼트들이 하위 영역으로부터 할당되지만 Stack 세그먼트는 상위 영역부터 할당됩니다.


* Heap 영역이 커지면 Stack 영역이 작아지게 되고, 역도 성립합니다.

==> heap overflow : heap이 stack 영역을 침범하는 것

==> stack overflow : stack이 heap 영역을 침범하는 것






반응형