본문 바로가기

CS/CS

[CS] 프로세스 메모리 구조

 

개요

이번에는 간단하게 프로세스 메모리 구조에 대해 알아보겠습니다.

 

프로세스 메모리 구조는 하나의 프로세스의 메모리가 가지는 공간의 구성을 보여줍니다.


프로세스의 메모리 

여기서 말하는 프로세스의 메모리란 프로그램을 시작했을 때 할당되는 가상메모리를 의미합니다.

x86이라면 4GB(유저영역 2GB) , x64라면  256TB(128TB)입니다. 물론 실제 사용하는 공간만 매핑됩니다.

 

Windows x86 Process Virtual Memory Layout
(개념도, 실제 배치는 ASLR/로더/할당 상태에 따라 달라짐)

높은 주소
0xFFFFFFFF  +--------------------------------------+
            |             Kernel Space             |
0x80000000  +--------------------------------------+
            |   사용자 공간의 높은 주소 영역       |
            |   - DLLs (주로 MEM_IMAGE)            |
            |   - mapped views                     |
            |   - thread stacks (high -> low)      |
            |   - free regions                     |
            +--------------------------------------+
            |   여러 private allocation / heaps    |
            |   mapped files / free regions 혼재   |
            +--------------------------------------+
            |   EXE image                          |
            |   - .text                            |
            |   - .rdata                           |
            |   - .data                            |
            |   - .bss                             |
            +--------------------------------------+
            |   사용자 공간의 낮은 주소 영역       |
            |   (보통 미사용/예약 안 된 공간 많음) |
0x00000000  +--------------------------------------+
낮은 주소

 

매번 보면 프로세스 메모리를 나타내는 예시에서는 중간에 빈 공간이 존재하고 스택과 힙이 확장하며 이 빈 공간을 점점 점유하는 모양새로 보여집니다.

예시

높은 주소
+---------------------------+
|           Stack           |
|           ↓↓↓             |
|                           |
|        Free Space         |
|                           |
|           ↑↑↑             |
|            Heap           |
+---------------------------+
|      Code / Data / BSS    |
+---------------------------+
낮은 주소

 

하지만 실제로는 전체 가상메모리 내에서 각자의 공간을 reserve하고 commit하며 진행되기 때문에 서로 영향을 주거나 하지는 않습니다.

 

자세한 논의는 미루고 오늘은 각각의 기본적인 역할만 간단하게 다루겠습니다.


스택

스택은 지역변수, 함수 등 각 스레드가 함수 호출을 수행하면서 임시 실행 정보를 쌓아 두는 메모리 영역입니다.

 

스택은 처음 시작 시에 1MB를 reserve하며 1개의 page를 커밋합니다.

VirtualQuery를 통해 확인해보면

BaseAddress: 01200000, AllocationBase: 01200000, RegionSize: 0xfa000, State: MEM_RESERVE, Protect: UNKNOWN_PROTECT, Type: MEM_PRIVATE
BaseAddress: 012FA000, AllocationBase: 01200000, RegionSize: 0x2000, State: MEM_COMMIT, Protect: PAGE_READWRITE, Type: MEM_PRIVATE
BaseAddress: 012FC000, AllocationBase: 01200000, RegionSize: 0x4000, State: MEM_COMMIT, Protect: PAGE_READWRITE, Type: MEM_PRIVATE

시작 커밋 페이지와 가드 페이지 reserve된 메모리 합쳐 1MB가 되는 것을 확인할 수 있습니다.

 

스택 포인터의 위치에 따라 메모리를 사용하기 때문에 데이터가 영속적이지 않습니다.


힙은 동적 메모리 할당을 통해 사용하는 메모리입니다.

new, delete 혹은 malloc, free 등 이를 다루는 전용 함수를 통해 내부의 힙을 이용할 수 있습니다.

이 때 사용되는 힙은 디폴트 힙입니다. 별도의 힙을 만들 수도 있습니다.

 

힙 메모리는 유저가 직접할당하는 메모리로 스택과 다르게 해제하지 않는다면 계속해서 메모리에 남게 됩니다.

해제하지 않는다면 memory leak이 발생할 수 있습니다.


전역/정적 변수 : 전역 변수 등의 메모리는 스택, 힙과 다르게 프로세스 시작 시 고정된 크기를 미리 차지하고 있습니다. 아래에 이어 서술하겠습니다.

 

코드 영역(.text): 말 그대로 코드가 들어있는 영역입니다. 코드를 EIP같은 instructor pointer가 가리켜 이를 실행시킵니다.

초기화된 전역변수(.data): 초기화된 전역변수가 들어갑니다.

초기화되지 않은 전역변수(.bss): 초기화 되지 않은 전역변수가 들어갑니다.

 

.data의 데이터들은 실행파일에 들어있어야하지만 .bss의 데이터들은 저장할 필요가 없어 구분이 되어있습니다.

 

추가적으로 DLL등의 메모리도 올라갑니다.

 

'CS > CS' 카테고리의 다른 글

[1일 1CS] OSI 7계층  (0) 2026.03.20