CS Interview

스택과 힙 메모리 영역, Stack Heap Memory

게임이 더 좋아 2021. 8. 25. 12:31
반응형
728x170

 

운영체제를 배웠다면..

조금이라도 알 수 있지만

시험이 끝나면 까먹는 우리에게 다시 익힐 시간이 필요하다. 

다시 알아보자

 


 

 

 

 

** 데이터 영역에는 전역 변수, static variable들이 저장된다.

숫자나 문자열 값인 리터럴도 저장된다.

**리터럴이란 소스 코드의 고정된 값을 말한다.

즉, int i = 1; 에서 1을 말한다.

 

-생존 주기, Life Cycle은 프로그램의 시작부터 끝까지 가지고 있다.

 

text영역은 code segment라고도 불리는데

프로그램 코드가 저장되고 절대 변경되지 않는 구역이다.

 


 

우선 스택과 힙이 하는 역할에 대해서 알아보자.

 

스택에는 함수호출, Function Call에서 메모리 할당이 일어난다.

함수 호출에 쓰이는 지역변수, 매개변수가 저장되고

함수호출에 대한 활성 레코드들이 들어간다.

또한 return address가 있어서 다시 프로시져로 돌아갈 수 있게 한다.

즉, 함수가 종료될 경우 다시 반환하는 형식이다.

**함수가 종료되지 않고 계속 쌓이는 경우(recursive) 스택오버플로우가 발생할 수 있다.

또한 크기가 OS나 컴파일러에 의해 정해진다.

공간은 CPU에 의해 효율적으로 관리되고 메모리는 단편화되지 않는다.(스택 특성)

 

요약하면

스택은 접근이 매우 빠르고, 변수를 명시적으로 할당 해제할 필요가 없다.

컴파일러에 의해 메모리 해제 할당이 된다.  " } "

 

힙에는

동적으로 메모리를 할당할 때 사용된다.

즉, 프로그래머가 할당시키는 것이다.

 


 

그렇다면 왜 스택과 힙을 나눠놓았느냐?가 핵심이다.

 

 

스택은 매우 빠르게 접근과 할당이 가능하며 메모리에 낭비되는 공간이 없이 사용가능하다.

스택의 의미대로 그냥 차례대로 쌓기 때문이다. (연속적 메모리 영역이라고 할 수 있다)

하지만 용량이 무척 적어서 쓰기 힘들다.

 

힙은 사용자가 따로 할당, 관리를 해서 사용해야 하는 공간으로 스택보단 느리게 할당된다.

용량은 크지만 단편화의 위험성을 가지고 있다.

하지만 크기를 먼저 설정해주는 스택영역에서 보다 유연함을 가지고 있는 것이 장점이다.

또한 제대로 반환하지 않으면 Memory Leak이 일어나서 메모리에 손해를 볼 수 있다.

 

 

그렇다면 모든 영역을 빠르고 단편화도 없는 Stack으로 구현하면 안되는건가??

 

안된다.

stack의 특성상 데이터에 접근할 수 있는 부분은 top 밖에 없다.

stack에 활성레코드가 저장될 수 있는 이유이자, stack 자료구조를 적용할 수 있는 이유이며

함수가 실행 중일때만 접근 가능한 공간이다.

때문에 중간에 접근하려고 해도 불가능한 경우가 많다.

그래서 Heap에 할당을 하게되면 pointer로 해당 데이터에 접근이 가능하게 된다.

 


 

즉, 나눠놓은 목적은

프로그램 상에서 얼마나 메모리가 필요할 지 모르는 상태이고

미리 모두 할당해놓는 것은 쓰이지 않을 메모리까지 할당되어있는 비효율적인 상태에 놓일 수 있으므로

스택, 힙으로 나누어 할당을 하는 것이라고 할 수 있다.

 

 

728x90
반응형
그리드형