Demand Paging (지연 로딩)은
프로세스의 모든 가상 메모리 페이지를 처음부터 RAM에 올리지 않고,
실제로 접근되는 페이지만 RAM에 적재하는 방식이다.
운영체제는 가상 메모리 (Virtual Memory)를 제공하기 위해,
프로세스의 페이지들을 다음 두 곳 중 하나에 저장한다:
- RAM - DRAM 등 (빠르지만 용량이 작다)
- 디스크 - HDD, SSD 등 (느리지만 용량이 크다)
Demand Paging은 RAM을 디스크의 캐시처럼 사용하는 방식이라고 볼 수 있다.
그렇다면 왜 Demand Paging 방식을 사용할까?
사실 프로세스는 종종 자신이 할당받은 메모리의 일부만 실제로 사용한다.
예를 들어, 프로그램 코드 전체나 스택 중에서
현재 실행 중인 함수와 관련 없는 부분은 당장 필요하지 않다.
만약 Demand Paging을 사용하지 않고 프로세스가 사용하는 모든 메모리를
실행 시작 시점에 전부 RAM에 올리면,
- RAM이 빠르게 고갈되고
- 동시에 실행할 수 있는 프로세스 수가 급격히 줄어들 수 있기 때문에
Demand Paging을 사용함으로써 필요할 때 페이지를 로드하는 것이다.
Demand Paging은 Page Fault를 통해 동작한다.
아직 RAM에 없는 가상 페이지에 접근하면 CPU가 Page Fault를 발생시키고,
커널이 해당 페이지를 디스크에서 RAM으로 불러온다.
이때, 디스크에 있는 페이지는 두 종류로 나뉜다.
1. file-backed page
예시:
- 프로그램 코드 (.text 영역)
- 공유 라이브러리
- Memory-Mapped File
file-backed page는 페이지의 원본이 디스크의 파일임을 의미한다.
따라서 RAM에서 밀려나더라도 해당 파일에서 다시 읽어오면 복구할 수 있다.
2. Swap-backed page
예시:
- heap (
malloc) - stack
- 전역 변수
mmap(MAP_ANONYMOUS)
이 메모리는 익명 메모리(Anonymous Memory) 이다.
즉, 페이지의 원본이 파일이 아니라 프로세스가 생성한 데이터라는 뜻이다.
따라서 RAM에서 밀려났을 때 다시 읽어올 곳이 존재하지 않으므로,
RAM에서 밀려나면 디스크의 일부를 RAM의 백업 저장소로 사용하고자 만든 파티션 영역인 “swap 영역”에 저장된다.