메모리 구조

프로세스의 메모리 구조는 일반적으로 여러 영역으로 나뉘며, 대표적으로 코드, 데이터, 힙, 스택 영역으로 구성됩니다.

MemoryLoayout-MemoryLoayout

각 영역은 서로 다른 용도와 메모리 관리 방식을 가집니다.
효율적인 메모리 사용과 성능 최적화에 매우 중요하므로 이해할 필요가 있습니다.

운영체제는 가상 메모리 시스템을 통해 각 프로세스에 독립된 주소 공간을 제공하며, 이를 통해 메모리 보호와 효율적인 자원 관리를 수행합니다.

코드 영역

코드 영역(Code/Text Segment)는 프로그램의 실행 코드(컴파일된 명령어)가 저장되는 영역입니다.

CPU는 프로그램 카운터(PC)를 통해 코드 영역의 명령어를 순차적으로 가져와 실행합니다.

일반적으로 코드가 수정되지 않도록 읽기 전용으로 보호됩니다.
실행 파일의 텍스트 섹션(.text)에 해당합니다.

프로세스마다 하나씩 존재하며, 공유 라이브러리의 경우 여러 프로세스가 공유할 수 있습니다.

메모리 크기는 컴파일 시 고정됩니다.

함수와 메서드의 명령어 등이 저장됩니다.

void func() { /* 실행 코드 */ }

데이터 영역

데이터 영역(Data Segment)는 프로그램 시작 시 메모리에 올라가는 전역 변수와 정적 변수가 저장되는 영역입니다.

데이터 영역은 실행 파일의 .data, .bss 섹션과 대응되며, 프로그램 로딩 시 메모리에 배치됩니다.

초기화 된 데이터 영역과 초기화되지 않은 데이터 영역(BSS)로 나뉩니다.

초기화 된 데이터 영역은 초기값이 지정된 전역 혹은 정적 변수가 저장됩니다.

int value = 10;

초기화되지 않은 데이터 영역에는 초기값이 없는 전역 혹은 정적 변수가 저장됩니다.
이 영역의 데이터는 프로그램이 시작되기 전에 OS 커널에 의해 0으로 초기화 됩니다.

프로그램의 실행시 할당되며, 프로그램 종료시까지 메모리에 유지됩니다.
메모리의 크기가 고정되어있으며, 동적으로 변경되지 않습니다.

static int globalValue;

힙 영역

힙 영역(Heap Segment)은 런타임에 동적 메모리 할당을 위해 사용되며, 실제 메모리 관리는 운영체제와 메모리 할당자(Allocator)에 의해 수행됩니다.

new또는 malloc 등을 통해 메모리를 할당하고, delete 또는 free로 메모리를 해제합니다.
메모리를 필요한 만큼 요청해 사용할 수 있으며, 메모리를 해제하지 않으면 메모리 누수가 발생합니다.

일반적으로 메모리가 낮은 주소에서 높은 주소의 방향으로 할당되지만, 시스템 및 구현에 따라 다를 수 있습니다.

스택보다 상대적으로 접근 속도가 느립니다.

int* p = new int[10];
delete p;

스택 영역

스택 영역(Stack Segment)은 함수 호출 시 생성되는 스택 프레임(Stack Frame)을 저장하며, 여기에는 지역 변수, 매개변수, 리턴 주소 등이 포함됩니다.

이러한 스택 프레임들이 쌓여 호출 스택(Call Stack)을 구성하며, 이를 통해 함수 호출과 복귀 흐름이 관리됩니다.

함수가 호출될 때 메모리가 할당되고, 호출이 끝나면 자동으로 해제됩니다.
일반적으로 메모리의 높은 주소에서 낮은 주소의 방향으로 할당되지만, 시스템 및 구현에 따라 다를 수 있습니다.

메모리 크기가 제한적이기 때문에, 함수 호출이 깊어지거나 스택 프레임이 과도하게 쌓이면 스택 영역이 한계를 초과하여 스택 오버플로우가 발생할 수 있습니다.

LIFO(Last-In-First-Out)구조를 가집니다.

접근 속도가 빠릅니다.

ComputerScience 카테고리 내 다른 글 보러가기

댓글남기기