PintOS_Project03_Anonymous_Page

전두엽힘주기·2025년 5월 31일

PintOS

목록 보기
16/20
post-thumbnail

익명 페이지와 Lazy Loading

익명 페이지란?

  • 익명 페이지(Anonymous Page): 파일과 연결되지 않은 페이지 (매핑은 됨)
    • 주로 스택과 힙에서 사용
    • 디스크에 백업되는 파일 없음
    • 데이터 세그먼트
      (핀토스에서는 힙이 없다)
  • 파일 기반 페이지: 실행파일과 같은 디스크 파일에 기반한 페이지
    • 예: 코드

페이지의 생명 주기

초기화 →
(페이지 폴트 발생 시) →
지연 로딩 (lazy loading) →
스왑 인 / 스왑 아웃 →
삭제

  • 페이지 타입(VM_TYPE)에 따라 처리 방식이 다름

Lazy Loading

  • 필요한 시점까지 물리 메모리 할당을 지연
  • 메모리 사용량 최소화
  • eager loading 대비 초기 로딩 속도 개선

구현 흐름 요약

1. vm_alloc_page_with_initializer()

  • uninit_new() 호출로 초기화되지 않은 페이지 생성 (페이지는 할당하되 frame은 초기화되지 않은)
  • 페이지 타입에 따라 anon_initializer 또는 file_backed_initializer를 연결
  • 보조 페이지 테이블(spt)에 삽입

2. uninit_initialize()

  • 첫 페이지 폴트 시점에 호출
  • vm_initializer 함수 포인터를 이용해 진짜 초기화 함수 호출

3. anon_initializer()

  • 익명 페이지의 핸들러를 page->operations에 설정
  • 필요 시 struct anon_page 내용 설정

4. load_segment() + lazy_load_segment()

  • ELF 실행파일의 세그먼트를 지연 로딩으로 등록
  • 각 페이지에 대해 vm_alloc_page_with_initializer() 호출
  • lazy_load_segment()는 페이지 폴트가 발생했을 때 실제 내용 로딩

aux 구조체는 file 포인터, 읽을 바이트 수, 파일 오프셋 등을 담음

5. setup_stack() 수정

  • 첫 번째 스택 페이지는 즉시 할당
  • 커맨드라인 인자 넣기 위해 로딩 시점에 필요
  • VM_MARKER_0 같은 marker로 스택임을 명시 -> 스택을 식별하기 위해

6. vm_try_handle_fault()

  • 페이지 폴트 핸들러
  • spt_find_page()로 fault 주소의 페이지 구조체 탐색
  • 존재하면 vm_do_claim_page() 호출 → 초기화 실행

페이지 정리(Cleanup)

supplemental_page_table_kill()

  • 페이지 테이블의 모든 page에 대해 destroy(page) 호출
  • pml4 및 물리 메모리는 caller가 해제

uninit_destroy() / anon_destroy()

  • 각각 초기화되지 않은 페이지와 익명 페이지의 리소스를 정리

추가 구현 함수 정리

함수 이름역할
vm_anon_init()익명 페이지 서브시스템 초기화
supplemental_page_table_copy()fork 시 부모 → 자식 SPT 복사
setup_stack()첫 스택 페이지 즉시 할당 및 마킹
load_segment()실행파일 세그먼트에 대해 지연 로딩 등록
lazy_load_segment()페이지 폴트 발생 시 해당 세그먼트를 메모리에 로드

구현이 완료되면?

  • Project 2의 모든 테스트(fork 제외)는 통과 가능
  • 이후 fork, SPT copy 구현이 완료되면 전체 통과 가능

0개의 댓글