이야기박스
메모리 영역(Code, Data, Heap, Stack) 본문
이게 매번 헷갈려서 확실히 정리를 할 필요가 있겠네요.
프로세스가 차지하고 있는 메모리를 살펴보면
크게 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 영역을 침범하는 것
'Computer & Data > Operating System' 카테고리의 다른 글
부모, 자식 프로세스 (0) | 2017.11.24 |
---|---|
스레드와 메모리 영역 (0) | 2017.11.24 |
운영체제) 교착 상태 (Deadlock) (0) | 2017.06.14 |
운영체제) 메모리 관리5 (Memory Management) (0) | 2017.06.07 |
운영체제) 메모리 관리4 (Memory Management) (0) | 2017.06.07 |