728x90
Lazy Loading(지연 로딩)
Lazy Loading은 데이터를 즉시 로드하지 않고, 진짜 필요한 순간에 로딩하는 기법입니다. 운영체제에서는 페이지 접근 시점까지 메모리에 내용을 로딩하지 않는 방식을 말합니다.
왜 사용하는가?
- 성능 최적화: 실제로 사용되지 않는 페이지는 로딩하지 않아서 I/O 비용을 절감합니다.
- 메모리 절약: 전체 프로그램을 로드하지 않고, 필요한 페이지만 메모리에 할당합니다.
- 시작 속도 향상: exec() 후 빠르게 실행 시작 가능합니다. (나중에 필요한 부분만 로딩)
동작 흐름
- 프로그램 시작 시 전체 페이지를 즉시 로딩하지 않습니다.
- 필요한 페이지만 페이지 테이블에 등록합니다. (placeholder)
- 해당 주소를 실제로 접근할 때 Page Fault 발생합니다.
- OS가 핸들러에서 해당 페이지 내용을 디스크에서 읽어옵니다.
- 프레임을 할당하고, 페이지 테이블에 등록합니다.
- CPU 명령어 재실행합니다.
Pintos에서…
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() |
728x90
'크래프톤 정글(PintOS WEEK 9 ~ 14)' 카테고리의 다른 글
Swap Disk (0) | 2025.06.08 |
---|---|
Anonymous Page (익명 페이지) (0) | 2025.06.08 |
Page Fault (페이지 폴트) (0) | 2025.06.08 |
TLB(Translation Lookaside Buffer) (0) | 2025.06.08 |
Page Table (0) | 2025.06.08 |