eager loading
기존의 핀토스는 파일 전체를 메모리에 적재한다. 이는 당장 필요한 자원도 메모리에 적재되어 있지만 당장 필요하지 않은 자원들도 메모리에 적재되어 있음을 의미한다. 물리 메모리의 공간은 한정되어 있기 때문에, 다른 자원을 메모리에 적재하기 위해서는 스왑인과 스왑아웃의 절차를 거쳐야 한다. 이는 오버헤드가 상당히 큰 작업이다.
lazy loading
따라서 자원이 실제로 필요한 경우 이를 메모리에 적재하는 lazy loading방식을 채택한다. load segment 함수 안에서 vm_alloc_page_with_initializer 함수를 통해 페이지의 할당과 함께 추후 페이지 폴트가 일어났을 때 프레임에 적재할 파일에 대한 정보를 spt안에 저장한다. 또한 페이지의 타입과 초기화 함수도 함께 저장한다.
페이지 폴트가 일어나면 vm_try_handle_fault 함수가 호출되고, spt로부터 해당 페이지를 찾는다. 이후 vm_do_claim_page 함수에서 프레임을 할당하고 페이지와 연결한다. 또한 페이지의 가상 주소와 프레임의 물리 주소의 매핑 정보를 페이지 테이블에 추가한다.
초기화가 이루어지지 않았기 때문에 swap_in 함수는 uninit_initialize를 호출하게 되고, 여기서 해당 페이지 타입에 대한 초기화 함수와 함께 lazy_load_segment가 실행된다. 따라서 물리 프레임에 이전에 저장했었던 파일에 대한 정보를 바탕으로 데이터가 써진다.
'SW사관학교 정글 > 정글 TIL' 카테고리의 다른 글
[Pintos Project] File System - Indexed and Extensible Files (0) | 2022.12.20 |
---|---|
[Pintos Project] Virtual Memory - Copy on write (0) | 2022.12.13 |
[Pintos Project] User Programming - Argument Passing (1) | 2022.11.29 |
[Pintos Project] Alarm Clock and Priority Scheduling (6) | 2022.11.17 |
[WEEK 04] 다이나믹 프로그래밍(Dynamic Programming) (1) | 2022.10.15 |