컴퓨터 이론

demand-zero memory

pwerty 2025. 4. 28. 12:01
demand-zero memory는 가상 메모리 시스템에서 실제 접근 발생 시 0으로 초기화 된 페이지를 할당하는 메커니즘이다.
이는 메모리 관리의 핵심 기법으로 작동하며, 현대 운영체제에서 표준적으로 사용되는 방식이다.

demand-zero의 본질적 특성은 컴퓨터의 다른 분야에서도 요긴하게 이용된다. 상세하게 보면 :

  • Lazy Initialization, 게으른 초기화
    • 가상 주소 공간이 즉시 할당되긴 하지만, 물리 메모리 할당은 Page Fault 발생 할 때까지 안한다.
    • 실제 접근 시점에 0으로 채워진 페이지를 물리 메모리에 매핑한다.
    • Lazy initialization은 다양한 시스템에서 활용되지만, 현 시대에서 VMware, Docker같은 가상머신/컨테이너 환경에서도 요긴하다.
  • 보안 기반 설계
    • 이전 프로세스의 데이터 잔재를 제거하기 위해, 의도적인 0 초기화를 수행하게 된다.
  • 메모리 최적화
    • 실제 사용되지 않는 페이지는 물리 메모리를 차지하지 않으니, 40% 이상의 메모리 절약 효과가 있다.

구현 방식 비교

특성 Demand-zero 그냥 메모리 할당
물리 메모리 바인딩 지연된 상태, bind-on-access 즉시, bind-on-commit
초기화 시점 첫 접근 시 할당 시
오버헤드 페이지 폴드 비용 즉시 할당 비용
사용 사례 힙, 스택 파일 매핑

시스템 동작 메커니즘

  1. 가상 주소 공간의 확장이 시스템 콜로 인해 요청된다.
  2. 페이지 테이블 엔트리를 생성한다. present bit는 0으로..
  3. 실제 접근 시도를 했을 때, 페이지 폴트 트랩에 걸리고 페이지 폴트를 발생시킬 것.
  4. 커널이 물리 프레임을 할당하고 0으로 초기화한다.
  5. 페이지 테이블 업데이트를 하며 present bit가 1로 변한다.

이 기법은 메모리 사용 효율성과 보안성을 동시에 달성하기 위해 현대 OS에서 필수적으로 채택되었다.
리눅스의 경우 모든 동적 메모리 할당이 이 방식을 기반으로 구현된다.

이거 없을 땐 어땠나요

Demand-zero 개념은 1990년대 초반 도입되기 전까지의 메모리 관리 방식에 큰 변화를 가져왔다.
이 개념이 없을 때는 상당히 힘들었다고 한다.
  • Demand-zero 이전 시대의 메모리 관리
    • 즉시 초기화 방식
      • 물리 메모리를 malloc() 즉시 할당한다. (물론 C는 72년부터 있었어서 malloc 비슷한 무언가였을 것이다)
      • 4KB 페이지 전체를 수동으로 0으로 채우는 작업을 수행했다.
        • 이 때는 가상 메모리가 진짜 만들어지는걸 기다리는 시간이 필요했을 것 같다.
      • 그래서 문제점이..
        • 64KB 메모리 요청 시, 실제 64KB 물리 메모리를 점유했다. 사용 여부와 무관하게..
          • 그때 메모리는 정말 귀했을텐데 말이다......
        • 프로세스 시작이 이러한 사유들로 인해 지연되었을 것이다. 대용량 메모리 할당은 초기화에 더 많은 시간을 할애시켰다.
    • 수동 오버레이 관리
      • 프로그래머들은 오버레이 테이블이라는 것을 작성해야 했다.
        • 얘는 컴파일러/링커 수준에서 분할된 코드 블록을 런타임에 수동으로 load 하는 기법이다. 할게 아주 많았겠다.
      • 이로 인해 프로그래머의 생산성이 현대에 비해 저하되어 있었다.
    • 메모리 낭비 및 제한
      • 실제로 사용되지 않는 메모리에 대해서도 물리적 메모리가 할당되어 낭비가 발생했다.
      • 메모리 오버커밋, 즉 실제 물리 메모리보다 더 많은 가상 메모리 할당은 불가능 했다.
      • 동시에 실행 할 수 있는 프로세스의 수가 제한적이었다.

옛날 옛적에 있던 Atlas(1960년대) 에서 one-level store 라는 이름으로 가상 메모리 개념이 처음 논해질 때까지는 프로그래머는 메모리 관리에 대해 많은 부분을 직접 도맡아야했다. 이후 1980년대 후반에 상용 OS에 확산되었다.