본문 바로가기

개발&컴퓨터/IT지식

힙 메모리 영역과 스택 메모리 영역 (메모리 영역)

반응형

프로그램을 구동하게 되면 해당 프로그램은 메모리 영역에 올라가게 됩니다.

 

이렇게 메모리 영역에 올라가 있는 코드나 데이터들을 CPU에서 필요한 명령어나 데이터를 읽어가서 프로그램이 실행되게 되는데요.

크게 4가지로 구분되어 메모리에 올라가게 됩니다.

 

 

1. 코드 영역 (Code Segment)

 - 실제 프로그램 코드 자체가 적재되는 영역을 말합니다. C나 JAVA등의 개발 언어로 짜여진 프로그램은 컴퓨터가 이해할 수 있는 기계어의 형태로 컴파일 되어 파일 등에 저장되는데, 실제 이 파일의 프로그램에 대한 전체적인 코드 자체가 올라가는 영역입니다.

 - 프로그램 자체 영역으로 보시면 됩니다.

 

 

2. 데이터 영역 (Data Segment)

 - 프로그램이 실행되면서 필요한 변수가 저장되는 영역인데, 이 데이터 영역은 프로그램이 구동되는 동안 항상 접근 가능한 변수가 저장되는 영역이라고 생각하시면 됩니다. 즉, 전역 변수(Global Variables)와 정적 변수(Static Variables)를 위한 할당 공간입니다.

 

 

3. 스택 영역 (Stack Segment)

 - 함수(또는 메서드, 프로시져 등) 내에 정의된 지역 변수(Local Variables)가 저장되는 영역입니다.

 - 왜 스택이란 이름이 붙었을까요? 프로그램은 함수의 호출로써 실행된다고 보시면 되는데요. 함수는 다른 함수를 호출하고, 그 함수는 또 다른 함수를 호출하고, 처리가 완료되면 그 결과를 다시 자신을 호출한 함수에게 반환합니다. 다시 생각해보면 함수의 호출은 자료구조 중의 하나인 스택 구조 형태로 차곡차곡 메모리에 쌓이고, 처리가 끝나면 메모리에서 해제되는 모습을 보입니다. 가장 마지막에 들어간 것이 먼저 나오는 구조인 LIFO (Last In, First Out) 형태를 가진 스택 구조를 이용하면 이러한 데이터 관리를 쉽게 구현할 수 있을 것으로 보입니다.  (함수 하나가 실행되면 해당 함수에서 사용되는 지역 변수의 메모리가 스택 영역에 쌓이고, 함수가 끝나면 해당 지역 변수는 더 이상 사용되지 않으므로 메모리에서 해제시킵니다.)

 이렇게 스택의 구조를 활용하여 함수의 지역 변수 메모리를 관리하면 위의 메커니즘을 쉽게 구현할 수 있기 때문에 스택 형태로 영역을 만들어 활용하였고, 그리하여 스택 영역(스택 세그먼트)라 이름이 붙었습니다.

 

 

4. 힙 영역 (Heap Segment)

 - 힙 영역은 위에서 관리가 가능한 데이터 외에 다른 형태의 데이터를 관리하기 위한 빈 공간(Free Space)입니다. 어떤 형태의 데이터가 있을까요? 바로 동적 할당(Dynamic Allocation)을 통해 생성된 동적 변수(Dynamic Variables)를 관리하기 위한 영역입니다.

 - 힙 영역은 위의 다른 영역(데이터, 스택 등)을 모두 할당하고 남은 공간입니다. (남은 공간이라하여 딱히 영역에 제한이 있거나 그런 것은 아니고, 시스템의 메모리 공간 여유에 따라서 달라집니다.)

 - Java 나 C++ 등에서 'new' 를 통해, C에서 'malloc', 'calloc' 등을 통해 동적으로 생성되는 변수를 저장하기 위해 할당되는 영역이라고 생각하시면 됩니다.

 - 데이터 영역과 스택 영역은 컴파일러가 미리 공간을 예측하고 할당할 수 있지만, 동적 변수는 어느 시점에 어느 정도의 공간으로 할당 될지 정확하게 예측할 수 없기 때문에 프로그램 실행 중(Runtime)에 결정됩니다.

 

 

반응형