본문 바로가기

computer science

cs - 프로세스 메모리 구조: 코드, 데이터, 스택, 힙 영역

프로세스 메모리 구조: 코드, 데이터, 스택, 힙 영역의 이해

 

프로세스는 실행 중인 프로그램으로, 시스템에서 메모리를 할당받아 작업을 수행한다. 메모리는 몇 가지 영역으로 나뉘어 관리되며, 각 영역은 특정한 목적과 기능을 가지고 있다. 이 글에서는 프로세스에 할당되는 메모리의 주요 영역에 대해 알아보겠다.

 

 

  • 코드 영역 (Code Segment) 코드 영역은 프로그램의 실행 코드를 저장하는 영역으로, 컴파일된 기계어 코드가 위치한다. 이 영역의 데이터는 읽기 전용이며, 한 번 프로그램이 로드되면 변경되지 않는다. 코드 영역은 명령어의 순차적 실행을 보장하며, 메모리 보호 기능을 통해 다른 영역으로부터 코드가 변경되는 것을 방지한다. 이를 통해 프로그램이 안전하게 실행될 수 있다. 이 영역은 실행 파일에 포함된 명령어들로 구성되어 있으며, 프로세스가 실행될 때 로드되고 실행된다. 코드 영역은 보통 운영 체제에 의해 관리되며, 다른 프로세스 간에 공유될 수 있다.

 

  • 데이터 영역 (Data Segment) 데이터 영역은 전역 변수와 정적 변수가 저장되는 공간으로, 프로그램이 시작될 때 초기화되고 종료될 때 해제된다. 이 영역은 런타임 중에 크기가 변경되지 않으며, 고정된 크기를 가진다. 데이터 영역은 프로그램의 실행 동안 지속되는 변수들을 저장하며, 전역 변수와 정적 변수의 생명주기가 프로그램의 시작부터 종료까지임을 보장한다. 

       이 영역은 두 부분으로 나뉜다.

 

  • 초기화된 데이터 영역: 프로그램에서 명시적으로 초기화된 전역 및 정적 변수들이 저장되는 영역이다. 변수에 할당된 초기 값들은 실행 파일에 저장되어, 프로세스가 실행될 때 메모리로 로드된다. 즉, 선언과 함께 값을 할당한 변수들이 이 영역에 속한다. 예를 들어, 다음과 같은 변수들이 이에 해당한다.
int globalVar1 = 10;        // 전역 변수
static int staticVar1 = 20; // 정적 변수

 

  • 초기화되지 않은 데이터 영역 (BSS, Block Started by Symbol): 프로그램에서 초기화되지 않은 전역 및 정적 변수들이 저장되는 영역이다. 변수들은 메모리에 로드될 때 모두 0으로 초기화된다. 이 영역은 메모리 사용 효율을 높이기 위해 사용되며, 실행 파일에는 실제 변수 크기만큼의 공간이 할당되지만 값들은 저장되지 않는다. 예를 들어, 다음과 같은 변수들이 이에 해당한다. 
int globalVar2;        // 전역 변수
static int staticVar2; // 정적 변수

 

  결론적으로, 초기화된 데이터 영역은 프로그램에서 선언과 함께 값을 할당한 전역 변수와 정적 변수들이 저장되는 영역이며, 초기화되지 않은 데이터 영역은 프로그램에서 선언 시 값을 할당하지 않은 전역 변수와 정적 변수들이 저장되는 영역이다. 이 두 영역은 프로그램의 메모리 사용과 관련하여 서로 다른 동작 방식을 갖는다.

 

  • 스택 영역 (Stack Segment) 스택 영역은 함수 호출과 관련된 정보를 저장하는 영역으로, 함수 호출 시 생성되는 지역 변수, 매개 변수 및 반환 주소 등이 저장된다. 스택은 후입선출(LIFO) 방식으로 동작하며, 함수 호출이 종료되면 해당 함수에 할당된 메모리가 자동으로 해제된다. 스택 영역은 함수 호출 시 필요한 정보를 빠르게 저장하고 검색할 수 있도록 구조화되어 있으며, 함수 호출 시 메모리 관리를 단순화한다. 스택은 후입선출 (LIFO, Last In First Out) 방식으로 데이터를 관리하며, 높은 주소에서 낮은 주소로 증가한다. 스택에 저장된 정보는 함수 호출에 따라 자동으로 생성되고 소멸되기 때문에 메모리 관리가 상대적으로 간편하다.

    스택의 주요 특징은 다음과 같다:

    스택 영역은 컴파일 시점에 크기가 결정되며, 실행 중에 크기가 변경되지 않는다.
    스택 프레임 (Stack Frame)이라는 개념을 사용하여 각 함수 호출에 대한 정보를 구성한다.
    재귀 호출과 같은 경우 스택 영역이 과도하게 사용될 수 있으며, 이는 스택 오버플로우로 이어질 수 있다.
  • 힙 영역 (Heap Segment) 힙 영역은 동적으로 할당된 메모리를 저장하는 영역으로, 프로그래머가 필요에 따라 메모리를 할당하고 해제할 수 있다. 힙 영역의 메모리는 런타임 중에 크기가 변경될 수 있으며, 가용 메모리 범위 내에서 자유롭게 할당 및 해제가 가능하다. 힙 영역은 프로그램에서 동적으로 생성되는 객체나 배열 등의 크기가 컴파일 시점에 결정되지 않는 데이터를 저장한다. 힙 영역의 메모리 할당은 프로그래머의 책임이기 때문에, 메모리 누수나 할당된 메모리의 해제를 올바르게 관리해야 한다. 프로그래머는 malloc, calloc, new 등의 함수를 사용하여 힙 영역에 직접 메모리를 할당하거나, free, delete 등의 함수를 사용하여 메모리를 해제할 수 있다. 이를 통해 데이터 구조의 크기가 동적으로 변경되는 경우에도 처리할 수 있다. 힙 영역은 낮은 주소에서 높은 주소로 증가한다. 힙 영역의 메모리 관리는 프로그래머에게 맡겨져 있으며, 할당 및 해제 작업이 적절히 수행되지 않으면 메모리 누수가 발생할 수 있다.

 

 

영역의 사용 목적과 특징을 알아보았다. 프로세스의 메모리 관리는 이러한 영역을 효과적으로 사용함으로써 구현된다. 프로그래머는 이러한 메모리 구조를 이해하고 올바른 메모리 할당 해제 방법을 사용하여 효율적인 프로그램을 작성할 있다. 이를 통해 프로그램의 성능과 안정성을 높이며, 메모리 효율성을 극대화할 있다.