Lazy Loading은 데이터를 즉시 로드하지 않고, 진짜 필요한 순간에 로딩하는 기법입니다. 운영체제에서는 페이지 접근 시점까지 메모리에 내용을 로딩하지 않는 방식을 말합니다.

Pintos는 Lazy Loading을 매우 직접적으로 구현합니다. 특히, process_exec()에서 ELF 파일을 로드할 때 전체 파일을 한 번에 메모리에 올리는 것이 아니라, 각 세그먼트에 대해 지연 로딩 핸들러를 등록합니다.
구현 요소는 다음과 같습니다.
| 구성요소 | 설명 |
|---|---|
struct page | 각 가상 주소에 대한 페이지 메타데이터 |
page_initializer | lazy_load_segment()을 호출하기 위한 함수 포인터 |
aux | 로딩할 정보(파일, 오프셋, 읽을 바이트 수 등)를 담은 구조체 |
vm_alloc_page_with_initializer() | 해당 주소에 실제로 로딩할 페이지 정보를 등록 |
vm_try_handle_fault() | 접근 시 fault 발생 → 실제 로딩을 실행 |
pintos 코드 흐름
/* 프로세스 exec 시 각 segment를 lazy loading으로 등록 */
vm_alloc_page_with_initializer (VM_FILE, addr, writable,
lazy_load_segment, aux);
→ 실제로 페이지에 접근시 다음과 같습니다.
bool
vm_do_claim_page (struct page *page) {
...
/* page_initializer 함수 호출 → lazy_load_segment() 수행 */
return page->uninit.init (page, aux);
}
그럼, aux 구조체에는 어떤 정보가 들어있을까요?
struct lazy_load_arg {
struct file *file;
off_t offset;
size_t read_bytes;
size_t zero_bytes;
};
즉, “이 주소에 접근하면, file에서 offset부터 read_bytes만큼 읽고, 나머지는 0으로 채워라”는 의미입니다.
| 항목 | 설명 |
|---|---|
| Lazy Loading이란? | 실제로 접근하기 전까지 데이터 로딩을 지연시키는 전략 |
| 목적 | 메모리 절약, 빠른 시작, 불필요한 I/O 최소화 |
| OSTEP에서의 개념 | 주소 접근 → page fault → OS 개입 → 페이지 로딩 |
| Pintos 구현 | vm_alloc_page_with_initializer()로 지연 로딩 정보 등록 → page_fault() 시 실제 로딩 수행 |
| 핵심 함수 | lazy_load_segment(), vm_try_handle_fault(), vm_do_claim_page() |