본문 바로가기

CS

[cs] 메모리 구조 알아보기 (스택, 힙, 데이터, 코드 영역)

다음은 운영체제의 메모리 공간이다.

 

📌코드(code) 영역

메모리의 코드(code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부른다.

CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.

코드 영역에는 상수, 함수, 제어문 등이 저장된다.

 

📌데이터(data) 영역

메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다.

데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.

 

📌힙(heap) 영역

모리의 힙(heap) 영역은 사용자에 의해 관리되는 영역이다. 흔히 동적으로 할당 할 변수들이 이곳에 저장된다고 보면 된다.

힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

힙 영역은 대개 메모리의 낮은 주소에서 높은 주소로 할당된다.

 

📌스택(stack) 영역

메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.

스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 메모리에서 해제시킨다.

스택 영역은 힙과 반대로 높은 주소에서 낮은 주소로 메모리에 할당된다.

스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작한다.

 

 

 

아래 C언어 예시로 각각 어떤것들이 영역에 할당되는지 파악할 수 있다.

메모리구조

위 이미지처럼 상수, 함수는 Text 영역에, 전역, 정적변수는 Data 영역에, 지역변수들은 Stack 영역에, 동적할당이 되는 변수들은 Heap영역에 위치하게 된다. (참고로 malloc 함수는 런타임(실행중)에 메모리를 동적으로 할당할 수 있는 함수라는 것 정도로만 알아두면 된다.)

 

 

 

📝Heap 과 Stack

앞서 우리가 메모리에서 4가지 영역으로 구분하여 살펴보았는데, 그 중 가장 대표적인 Heap과 Stack 영역이다.

바로 Stack과 Heap은 프로그램이 실행하면서 생성되는 데이터들이 저장되는 공간이기 때문이다.

 

 

 

📌스택 오버플로우(Stack Overflow)

Stack Overflow는 호출 스택이 할당 된 스택 영역 경계선 밖으로 넘어갈 때 발생한다. 주로 재귀호출에서 많이 발생한다.

무한히 stack 영역에 데이터가 push되다가 Stack영역을 넘어가버리게 되면 바로 Stack Overflow가 발생하게 되는것이다.

스택 오버플로우 설명

 

 

📌힙 오버플로우(Heap Overflow)

스택과 마찬가지로 Heap영역보다 큰 데이터가 들어올 경우 발생하는데, Stack에서는 지역변수들이 스택에 쌓인다면, 반대로 Heap 영역에서는 동적으로 관리되는 데이터들이 일정 공간 이상 차지하게 될 경우 발생한다.

각 언어마다 Heap 에서 관리하는 데이터는 조금씩 상이하지만, 동적 할당 함수, 객체, 참조변수들이 Heap 영역에서 관리된다.

Heap 영역을 넘치게 하는 가장 쉬운 방법은 아주아주 큰 배열을 생성하는 것이다.

 

Java에서는 JVM(자바 가상머신)이 더이상 참조되지 않는 데이터들의 경우 알아서 메모리를 반납해주는 GC(Garbage Collector : 가비지 컬렉터)가 있기 때문에 Heap 메모리 관리에 보다 수월하지만, C, C++같은 경우는 GC가 따로 없기 때문에 반드시 더이상 쓰지 않는 동적 할당 변수들을 해제해주어야 한다. 만약 해제 하지 않는 경우 흔히 말하는 메모리 누수(Memory Leak)가 발생하게된다.

 

또한 동적으로 관리해야 하는 변수들의 경우 어느정도 크기를 예측하고 제한할 수 있어야 힙 메모리가 부족한 현상이 안올것이다.

힙 오버플로우 설명

 

 

 

 

 

 

 

 

 

 


참고링크 : https://st-lab.tistory.com/198