메모리 구조
메모리 구조
실행파일을 만든다면 실행파일로 디스크에 저장합니다. 그리고 운영체제에 실행파일을 실행하도록 요청할 것입니다. 그러면 운영체제는 프로그램의 정보들을 읽고 메인 메모리에 공간을 할당해줍니다.
메모리의 구조를 살펴보면,
Text, Code 영역
텍스트 영역은 아주 쉽게 말하면 코드를 실행하기 위해 저장되어있는 영역입니다. 흔히 코드 영역이라고도 하는데, 프로그램을 실행시키기 위해 구성되는 컴파일 된 기계어들이 저장되는 영역입니다. 한마디로 명령문들이 저장되는 것인데, 제어문, 함수, 상수들이 이 영역에 저장됩니다.
프로그램이 시작하고 끝날 때까지 메모리에 계속 남아있습니다.
Data 영역
데이터 영역은 우리가 작성한 코드에서 전역변수, 정적변수 등이 저장되는 공간입니다. 이들의 특징을 보면 보통 메인(main)함수 전(프로그램 실행 전)에 선언되어 프로그램이 끝날 때 까지 메모리에 남아있는 변수들이라는 특징이 있습니다.
초기화 된 변수 영역(initialized data segment)과 초기화되지 않은 변수 영역(uninitialized data segment)으로 나뉘죠. 그리고 그 중 초기화되지 않은 변수 영역은 BSS(Block Started by Symbol) 이라고도 합니다.
Heap 영역
힙 영역은 쉽게 말해서 사용자에 의해 메모리 공간이 동적으로 할당되고 해제되는 영역입니다. Java나 C++에서 new 연산자로 생성하는 경우 또는 class, 참조 변수들도 Heap영역에 차지하게 됩니다. 다만, 이는 언어마다 조금씩 상이하니 일단은 ‘동적 할당 영역’이라고 알아두시면 될 것 같습니다.
그리고 Heap 영역은 낮은 주소에서 높은 주소로 할당(적재)됩니다.
Stack 영역
스택 영역은 함수를 호출 할 때 지역변수, 매개변수들이 저장되는 공간입니다. 프로그램이 자동으로 사용하는 임시 메모리 영역이라고 할 수 있습니다. 메인(main) 함수안에서의 변수들도 당연 이에 포함됩니다. 그리고 함수가 종료되면 해당 함수에 할당된 변수들을 메모리에서 해제시킵니다. (Stack 자료구조의 pop과 같은 기능)
Stack영역은 Heap영역과 반대로 높은주소에서 낮은주소로 메모리에 할당됩니다.
Stack overflow
‘재귀’ 함수를 반복적으로 호출하면서 Stack 메모리 영역에 해당 함수의 지역변수, 매개변수들이 계속 할당되다가 OS에서 할당해준 Stack영역의 메모리 영역을 넘어버리면 발생하는 오류를 말합니다. (stack 영역이 heap을 침범하는 경우 <-> 반대의 개념 Heap overflow)
댓글남기기