컴퓨터의 프로그램에서 프로세스가 차지하고 있는 메모리를 살펴보면
크게 Code, Data, Stack, Heap 영역으로 나뉘어져 있다.
이들을 각각 Segment라고 한다.
Code : 위 그림에서 text부분에 해당 한다. 작성한 코드가 들어가는 부분이다 읽기전용 영역이라 쓰기 작업이 들어오면 잘못된 메모리 접근(access violation) 에러가 발생하며, 프로세스가 종료될때까지 계속 유지 되는 영역이다 (그래서 Static)
Data : 전역변수 (Global), 정적변수 (Static), 배열 (Array), 구조체(Struct)등이 저장된다.
초기화된 데이터는 : 위 그림에 data에 저장
초기화되지 않은 데이터 : bss(Block Stated Symbol)에 저장
bss도 초기화를 하지만, 값자체를 초기화하는 것이 아니라 메모리상의 공간을 초기화
data영역은 컴파일시간에 초기화하는 것이라면 bss는 런타임시간에 초기화한다
이 영역 또한 프로세스의 종료까지 유지된다.
(함수 내에 변수들은 여기에 포함되지 않음 함수내 지역변수는 stack에 할당됨 main 함수도 마찬가지)
Heap
프로그래머가 동적으로 사용하는 영역이다. malloc/free, new/delete에 의해서 할당 혹은 반환이 되는 영역이고, 매니지드언어(Java, C#)에서 GarbageCollector에 의해 자동으로 반환되는 영역이다. 참고로 모든 메모리 공간은 무한하지 않으므로 프로그래머가 new를 해서 할당을 받으려 했을때 공간이 부족하면 실패도 할 수 있다.
Stack
지역변수, 매개변수, 복귀번지 등이 저장되어 있는 프로그램이 자동으로 사용하는 메모리공간이다. 스코프 시작시 생성되고 스코프가 끝나면 반환된다 ( 함수내부 혹은 { } 같은 것 )
이 공간은 Heap공간보다 작고 크기가 크지 않기 때문에 이 공간을 넘어버리면 StackOverflow가 발생할 수 도 있다.