크래프톤 정글(PintOS WEEK 9 ~ 14)

Lazy Loading(지연 로딩)

devkty 2025. 6. 8. 00:23
728x90

Lazy Loading(지연 로딩)

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

왜 사용하는가?

  • 성능 최적화: 실제로 사용되지 않는 페이지는 로딩하지 않아서 I/O 비용을 절감합니다.
  • 메모리 절약: 전체 프로그램을 로드하지 않고, 필요한 페이지만 메모리에 할당합니다.
  • 시작 속도 향상: exec() 후 빠르게 실행 시작 가능합니다. (나중에 필요한 부분만 로딩)

동작 흐름

  1. 프로그램 시작 시 전체 페이지를 즉시 로딩하지 않습니다.
  2. 필요한 페이지만 페이지 테이블에 등록합니다. (placeholder)
  3. 해당 주소를 실제로 접근할 때 Page Fault 발생합니다.
  4. OS가 핸들러에서 해당 페이지 내용을 디스크에서 읽어옵니다.
  5. 프레임을 할당하고, 페이지 테이블에 등록합니다.
  6. 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