Demand-zero memory: 필요할 때 0으로 채워 붙이는 메모리

Demand-zero memory(또는 zero-filled-on-demand page)는 운영체제가 “필요해지는 순간(demand)” 에만 물리 페이지를 연결하고, 그 페이지의 모든 바이트를 0으로 채워(zero-fill) 사용자 프로세스에 넘겨주는 메모리 할당 기법이다.

1. 동작 흐름

1단계. 가상 주소 공간만 예약

프로그램이 malloc, VirtualAlloc(..., MEM_RESERVE), 스택 확대, BSS(전역·정적 0-초기화 변수) 등으로 새 메모리를 요구하면, 커널은 물리 페이지를 붙이지 않은 채 가상 주소 범위만 예약한다. 이때 해당 PTE(Page-Table Entry)에는 “아직 물리 페이지 없음, demand-zero”라는 플래그를 세워 둔다.

2단계. 첫 접근 → 페이지 폴트

CPU가 그 주소를 읽거나 쓰려고 하면, PTE에 실제 프레임이 없으므로 페이지 폴트(page fault) 가 발생한다.

3단계. 물리 페이지 할당 & 0 초기화

커널은 둘 중 한 방법으로 페이지를 마련한다.

  • Zero Page List(이미 0으로 클리어된 여유 페이지 풀)에서 하나를 꺼내오거나,
  • 여유 페이지가 없으면 새 페이지를 확보한 뒤 memset(page, 0, PAGE_SIZE)로 0-필(fill)한다

4단계. PTE 갱신 후 재시도

PTE를 “valid + 해당 물리 프레임” 상태로 고친 뒤, 폴트가 났던 명령을 재실행한다. 이제는 정상적으로 0값이 읽힌다.

2. 왜 쓰일까?

장점 설명
메모리 절약 큰 배열·구조체를 0으로 예약만 해두고, 실제 접근한 부분만 물리 메모리를 소비한다
보안 & 안정성 항상 0으로 채워 주므로, 이전 프로세스의 잔류 데이터가 노출되지 않는다
속도(평균) 초기화 루프를 사용자 코드에서 돌릴 필요가 없고, 커널은 미리 0-클리어된 zero-page 풀을 재사용해 폴트 처리 시간을 줄인다

3. 언제 볼 수 있을까?

환경 사례
Windows MEM_COMMIT 없이 VirtualAlloc으로 예약만 한 뒤 접근할 때, 또는 HeapAlloc/new 내부
Linux / Unix 익명 매핑 mmap(..., MAP_ANONYMOUS), 스택, BSS, brk/sbrk
하이퍼바이저 / VM 게스트가 처음 쓰는 시점까지 호스트 RAM을 배정하지 않는 ballooning 기법과 결합되기도 함

4. 요약

Demand-zero memory는 한마디로 “필요할 때 0으로 초기화된 물리 페이지를 뒤늦게 붙이는 가상 메모리 기술” 이다.

프로그램 입장에서는 ‘이미 0으로 초기화된 새 메모리’를 즉시 얻은 것처럼 보이지만, 실제 RAM은 첫 사용 시점까지 쓰이지 않아 메모리를 아끼고 보안을 높인다.

한 줄 정리

  1. 물리 메모리는 첫 사용 전까지 할당되지 않는다
  2. 그러나 가상 메모리에는 이미 공간이 확보되어 있다
  3. 실제 사용 시 page fault가 발생하며 물리 메모리가 할당되고, PTE가 Not-present → Present로 갱신된다

© 2022 JeongHwan Yun.