Krafton Jungle/2. Keywords

[WEEK07] Demand-zero Memory

munsik22 2025. 4. 28. 17:04

Demand-zero Memory

Demand-zero memory는 프로세스가 새로운 메모리 페이지를 요청할 때, OS가 실제 물리 메모리를 즉시 할당하는 대신 나중에 필요한 순간까지 미루는 lazy한 기술이다. 그리고 실제로 해당 메모리에 접근하려고 할 때, 운영체제는 그제서야 메모리 페이지를 0으로 초기화하고 물리 메모리를 할당한다.

  • 여기서 lazy란 어떤 자원을 요청하거나 동작을 요청했을 때, 그것이 정말 필요해질 때까지 실제 자원을 할당하거나 동작을 실행하지 않음을 의미한다. (참고)

💡 필요할 때

메모리를 0으로 초기화해 제공하는 것

동작 흐름

  1. 프로세스가 malloc 등을 사용해 메모리 할당 요청
  2. 운영체제는 실제 메모리를 즉시 할당하지 않고, 해당 영역에 Demand-zero 페이지를 매핑
  3. 프로세스가 해당 메모리 영역에 최초로 접근
  4. Page Fault 발생 (접근 가능한 실제 메모리 없음)
  5. OS가 새 물리 메모리 페이지를 할당하고 0으로 초기화
  6. 프로세스는 정상적으로 0으로 채워진 메모리를 사용
 
요청 → 가상 메모리에 예약만 함 → 실제 접근 → Page Fault → 0으로 초기화된 메모리 할당

관련 예제

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main() {
    size_t size = 1<<12; // 단일 페이지 크기 (4KB)
    
    char *memory = (char *)malloc(size);
    
    if (memory == NULL) {
        perror("malloc failed");
        return 1;
    }

    printf("Memory allocated. (Not yet accessed)\n");
    sleep(1); // 여기서는 아직 메모리에 접근하지 않았기 때문에 Page Fault 없음

    printf("Accessing first byte...\n");
    memory[0] = 'A'; // 여기서 Page Fault 발생 -> 운영체제가 0으로 초기화된 실제 메모리 페이지를 할당

    printf("memory[0] = %c\n", memory[0]); // A 출력

    printf("Accessing second byte... (Check if initialized)\n");
    printf("memory[1] = %d\n", memory[1]); // 0 출력

    free(memory);
    return 0;
}

 

  • malloc 호출만으로는 실제 메모리가 할당되지 않았을 수도 있다 (lazy하기 때문).
  • memory[0] = 'A'; 처음 쓸 때 Page Fault가 발생하고, 그때 (0으로 초기화된) 실제 메모리가 연결된다.
  • memory[1]을 읽으면 0이 출력되는데, 이는 Demand-zero로 초기화된 결과다.

 

장점

  • 성능 향상: 초기화 비용을 실제로 필요한 메모리에만 지출할 수 있다.
  • 메모리 절약: 할당만 하고 실제로 사용하지 않는 메모리에 대해 물리 메모리를 낭비하지 않는다.
  • 보안 강화: 과거 데이터가 남지 않도록 항상 0으로 초기화된 메모리 제공한다.

단점

  • 오버헤드: 페이지가 실제로 사용될 때마다 페이지 폴트 처리가 필요하므로 오버헤드가 발생할 수 있다.
  • 성능 지연: 페이지를 0으로 초기화하는 과정에서 미세한 지연이 발생할 수 있고, 페이지 폴트가 빈번하게 발생하면 시스템의 전체적인 성능에 영향을 줄 수 있다.

어디서 사용될까?

  • 일반적인 프로그램의 메모리 할당 (malloc, new)
  • Windows의 VirtualAlloc 함수
  • Linux의 mmap, brk 시스템 호출
  • 다양한 OS에서 기본 메모리 관리 최적화에 활용

Copy-on-write와 차이점

비슷한 메커니즘으로 Copy-on-Write(COW) 메모리가 있다. COW는 읽기 전용으로 공유하고, 수정 시 복사하는 방식이다. Demand-zero는 최초 접근만을 기준으로 한다는 점이 다르다.

구분 Demand-zero Copy-on-Write
초기 접근 시 0으로 초기화된 페이지 할당 복사 후 수정
목적 초기 메모리 절약 및 보안 강화 프로세스 복제 최적화