YK
← Posts

프로세스 메모리의 전체 흐름

2026-04-10

프로세스는 물리적 하드웨어를 직접 제어할 권한이 없다. 메모리 접근은 CPU 내부의 Mode bit와 권한 수준(Privilege Level)에 의해 철저히 통제된다.

CPU는 명령어의 종류에 따라 실행 권한을 제한한다. 메모리의 상태를 변경하거나 외부 장치를 제어하는 특권 명령어(Privileged Instruction)는 오직 Kernel Mode에서만 실행될 수 있다. 일반적인 프로세스는 User Mode에서 동작하며, 이 상태에서는 물리 메모리(RAM)의 주소를 직접 읽거나 쓰는 하드웨어 명령어의 실행이 차단된다.

프로세스가 실행될 때 OS는 Virtual Memory(가상 메모리) 레이아웃을 생성한다. 가상메모리란 각 프로세스에 독점적으로 부여되는 연속적인 1차원 논리 주소 공간이다. 물리 메모리의 파편화 상태와 무관하게 0x00000000부터 시작하는 선형 주소를 제공하지만, 이 주소를 물리적 RAM과 바이트 단위로 1:1 매핑할 경우 매핑 테이블의 크기가 비현실적으로 커지는 구조적 한계가 존재한다.

이를 해결하기 위해 도입된 아키텍처가 Paging(페이징)이다. 페이징은 가상 메모리를 고정된 크기(일반적으로 4KB)의 블록인 Page로 분할하고, 물리 메모리 역시 동일한 크기의 Frame으로 분할하여 관리하는 기법이다. 가상 주소와 물리 주소의 매핑 정보는 다단계 트리 구조의 자료구조인 Page Table에 저장된다.

OS가 프로세스에 CPU 제어권을 넘기기 전, 하드웨어 주소 변환기인 MMU(Memory Management Unit)가 참조할 기준 레지스터(예: CR3 레지스터)에 해당 프로세스의 최상위 Page Table 물리 주소를 설정한다. 이후 프로세스가 생성하는 모든 가상 주소는 MMU에 의해 하드웨어 레벨에서 물리 주소로 자동 변환된다.

프로세스 실행 중 동적 메모리 할당이 필요해지면, User Mode 권한으로는 힙(Heap) 영역의 가상 주소 경계를 확장할 수 없다. 이를 우회하기 위해 System Call(시스템 콜)이 호출된다.

System Call(sbrk, mmap 등)은 소프트웨어 인터럽트(Trap)를 발생시켜 CPU 권한을 Kernel Mode로 일시적으로 전환하는 인터페이스이다. 커널 권한으로 실행된 OS는 프로세스의 가상 메모리 유효 범위를 4KB 단위(Page)로 확장하고, Page Table에 새로운 Entry를 예약한다.

중요한 점은 메모리 확장 요청 시 OS가 즉각적으로 물리 RAM을 할당하지 않는다는 것이다. Page Table에 주소의 유효성만 표시해 둔다. 이후 제어권이 프로세스로 돌아가 해당 가상 주소에 실제로 접근을 시도할 때, MMU는 매핑된 물리 프레임이 없음을 확인하고 하드웨어 예외인 Page Fault를 발생시킨다.

예외 처리기가 호출되면 OS는 비어있는 4KB Frame을 찾아 Page Table에 매핑하고, 중단되었던 명령어를 재실행한다. 이처럼 실제 메모리 접근이 발생한 시점에 물리 메모리를 연결하는 지연 할당 메커니즘을 Demand Paging이라 정의한다.

Demand Paging은 물리 메모리 낭비를 줄이지만, 런타임 성능 측면에서 막대한 오버헤드를 유발한다. 단일 변수를 할당할 때마다 System Call을 호출하고 Page Fault를 처리하는 것은 비효율적이다. 또한 OS가 제공하는 메모리의 최소 단위는 4KB인 반면, 프로세스 내에서 필요한 메모리 블록의 크기는 수십 바이트 단위로 훨씬 작다.

이러한 간극을 메우고 오버헤드를 제어하기 위해 User Space에서 동작하는 Allocator가 도입된다. C 언어의 malloc으로 대표되는 Explicit Allocator는 System Call 호출 횟수를 최소화한다. 단일 sbrk 호출을 통해 OS로부터 큰 덩어리(Page의 배수)의 가상 힙 공간을 일괄 확보하고, 자체적인 알고리즘을 통해 이 공간을 관리한다. CPU의 메모리 접근 최적화를 위해 8바이트나 16바이트 단위의 Alignment규칙을 적용하여 블록을 분할하거나 병합한다.

물론 블록 단위로 메모리를 분할 관리하는 과정에서 Fragmentation문제가 필연적으로 발생한다.

  • Internal Fragmentation(내부 단편화): 정렬 규칙이나 최소 블록 규격 제한으로 인해, 할당된 블록 내부에 유저가 사용하지 않고 버려지는 잉여 공간.

  • External Fragmentation(외부 단편화): 전체 힙 영역의 가용 메모리 총합은 충분하지만, 블록들이 작게 쪼개져 분산된 탓에 크기가 큰 연속된 메모리 할당 요청을 처리하지 못하는 상태.

결국 할당기 구현의 핵심 목표는 비싼 System Call 호출을 피하는 동시에, Free list 기반의 내부 자료구조를 최적화하여 두 가지 단편화를 억제하고 힙 영역의 처리량과 메모리 이용도를 극대화하는 것이다.