컴퓨터 이론
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 |
초기화 시점 | 첫 접근 시 | 할당 시 |
오버헤드 | 페이지 폴드 비용 | 즉시 할당 비용 |
사용 사례 | 힙, 스택 | 파일 매핑 |
시스템 동작 메커니즘
- 가상 주소 공간의 확장이 시스템 콜로 인해 요청된다.
- 페이지 테이블 엔트리를 생성한다. present bit는 0으로..
- 실제 접근 시도를 했을 때, 페이지 폴트 트랩에 걸리고 페이지 폴트를 발생시킬 것.
- 커널이 물리 프레임을 할당하고 0으로 초기화한다.
- 페이지 테이블 업데이트를 하며 present bit가 1로 변한다.
이 기법은 메모리 사용 효율성과 보안성을 동시에 달성하기 위해 현대 OS에서 필수적으로 채택되었다.
리눅스의 경우 모든 동적 메모리 할당이 이 방식을 기반으로 구현된다.
이거 없을 땐 어땠나요
Demand-zero 개념은 1990년대 초반 도입되기 전까지의 메모리 관리 방식에 큰 변화를 가져왔다.
이 개념이 없을 때는 상당히 힘들었다고 한다.
- Demand-zero 이전 시대의 메모리 관리
- 즉시 초기화 방식
- 물리 메모리를 malloc() 즉시 할당한다. (물론 C는 72년부터 있었어서 malloc 비슷한 무언가였을 것이다)
- 4KB 페이지 전체를 수동으로 0으로 채우는 작업을 수행했다.
이 때는 가상 메모리가 진짜 만들어지는걸 기다리는 시간이 필요했을 것 같다.
- 그래서 문제점이..
- 64KB 메모리 요청 시, 실제 64KB 물리 메모리를 점유했다. 사용 여부와 무관하게..
- 그때 메모리는 정말 귀했을텐데 말이다......
- 프로세스 시작이 이러한 사유들로 인해 지연되었을 것이다. 대용량 메모리 할당은 초기화에 더 많은 시간을 할애시켰다.
- 64KB 메모리 요청 시, 실제 64KB 물리 메모리를 점유했다. 사용 여부와 무관하게..
- 수동 오버레이 관리
- 프로그래머들은 오버레이 테이블이라는 것을 작성해야 했다.
- 얘는 컴파일러/링커 수준에서 분할된 코드 블록을 런타임에 수동으로 load 하는 기법이다. 할게 아주 많았겠다.
- 이로 인해 프로그래머의 생산성이 현대에 비해 저하되어 있었다.
- 프로그래머들은 오버레이 테이블이라는 것을 작성해야 했다.
- 메모리 낭비 및 제한
- 실제로 사용되지 않는 메모리에 대해서도 물리적 메모리가 할당되어 낭비가 발생했다.
- 메모리 오버커밋, 즉 실제 물리 메모리보다 더 많은 가상 메모리 할당은 불가능 했다.
- 동시에 실행 할 수 있는 프로세스의 수가 제한적이었다.
- 즉시 초기화 방식
옛날 옛적에 있던 Atlas(1960년대) 에서 one-level store 라는 이름으로 가상 메모리 개념이 처음 논해질 때까지는 프로그래머는 메모리 관리에 대해 많은 부분을 직접 도맡아야했다. 이후 1980년대 후반에 상용 OS에 확산되었다.