PintOS | 그림으로 따라가는 PintOS Lazy Loading & Swap 흐름

맹쥐·2025년 6월 4일

kaist - PintOS

목록 보기
8/10

[ struct page 구조 파악 ]

프로세스 실행 흐름

프로세스가 실행될 때 process_exec()load() 함수 순으로 호출되며, lazy_load_segment()가 실행된다.
이때 vm_alloc_page_with_initializer()를 통해 VM_UNINIT 타입의 페이지가 만들어진다.

이렇게 등록된 페이지들은 SPT에 저장되어, 페이지 폴트 발생 시 필요한 처리를 한다.


lazy loading 처리 흐름을 그림으로 살펴보자!


1. 사용자가 해당 주소를 접근할 때 page_fault()가 발생한다.
2. vm_try_handle_fault()-> vm_do_claim_page()호출해서 메모리 안의 공간을 할당한다.
3. swap_in 함수가 실행된다.
4. 이후 디스크에서 파일 내용을 읽어오거나, 0으로 초기화 한다.
(그림에서 채워준다는 부분 !)


swap_in 함수가 호출된다.

이 함수는 해당 페이지가 디스크에서 불러와야 하는 건지, 그냥 0으로 채워야 하는 건지 판단해서
그에 맞는 동작을 수행한다.


하지만 시스템의 물리 메모리는 한정돼 있기 때문에,
어느 순간 페이지가 너무 많아지면 일부 페이지를 스왑 디스크로 내보내게 된다.
이걸 swap-out이라 부른다.

swap-out이 되면,

  • 해당 페이지는 메모리에서 쫓겨나고,

  • 프레임과 연결이 끊긴다.

  • 그리고 PTE_P 비트가 가 0으로 바뀐다.

즉, 이제 이 주소를 접근하면 "아, 이건 페이지는 존재하지만 지금 메모리에 없음!"이라는 걸 나타내는 상태가 된다.


다시 VA에 접근하면?

  1. CPU는 페이지 테이블을 조회하다가 pte_p == 0임을 보고 page_fault()를 일으킨다.
  2. 이때 vm_try_handle_fault()가 실행된다.

  1. SPT에 등록된 정보를 통해, 로드할 데이터가 어디있는지 확인해야 한다.
  2. 현재 경우는 스왑 디스크에 있으므로, 스왑 디스크에서 다시 해당 페이지를 불러오게 된다.
    → 이 과정을 swap-in이라고 한다.
profile
이유민

2개의 댓글

comment-user-thumbnail
2025년 6월 4일

그림이 있으니까 이해가 쉽네요

1개의 답글