Demand-zero Memory
Demand-zero memory는 프로세스가 새로운 메모리 페이지를 요청할 때, OS가 실제 물리 메모리를 즉시 할당하는 대신 나중에 필요한 순간까지 미루는 lazy한 기술이다. 그리고 실제로 해당 메모리에 접근하려고 할 때, 운영체제는 그제서야 메모리 페이지를 0으로 초기화하고 물리 메모리를 할당한다.
- 여기서 lazy란 어떤 자원을 요청하거나 동작을 요청했을 때, 그것이 정말 필요해질 때까지 실제 자원을 할당하거나 동작을 실행하지 않음을 의미한다. (참고)
💡 필요할 때
메모리를 0으로 초기화해 제공하는 것
동작 흐름
- 프로세스가 malloc 등을 사용해 메모리 할당 요청
- 운영체제는 실제 메모리를 즉시 할당하지 않고, 해당 영역에 Demand-zero 페이지를 매핑
- 프로세스가 해당 메모리 영역에 최초로 접근
- Page Fault 발생 (접근 가능한 실제 메모리 없음)
- OS가 새 물리 메모리 페이지를 할당하고 0으로 초기화
- 프로세스는 정상적으로 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으로 초기화된 페이지 할당 | 복사 후 수정 |
| 목적 | 초기 메모리 절약 및 보안 강화 | 프로세스 복제 최적화 |
'Krafton Jungle > 2. Keywords' 카테고리의 다른 글
| [WEEK07] 가비지 컬렉션과 메모리 관련 오류들 (0) | 2025.04.28 |
|---|---|
| [WEEK07] System Call (0) | 2025.04.28 |
| [WEEK07] 가상 메모리와 페이징 (0) | 2025.04.28 |
| [WEEK07] 명시적 가용 리스트와 분리 가용 리스트 (0) | 2025.04.25 |
| [WEEK07] 묵시적 가용 리스트 (0) | 2025.04.25 |