pintos project3를 진행하며 알게된 정보들을 정리하는 글이다.
pintos에서는 page_fault가 발생하는 경우를 세가지로 정리할 수 있다.
page에 매핑되는 frame을 찾을 수 없어서, read-only 파일에 writing을 하고자 할 때, 잘못된 주소를 참조했을 때
page에 매핑되는 frame을 찾을 수 없는 경우는 또 다시 세가지로 나뉘는데,
lazy_loading으로 인해 page는 할당되었는데 아직 frame을 할당받지 않았을 때, swap out이 되어 swap 영역에 있을 때, 처음 할당받은 stack 크기보다 더 사용해서 동적으로 stack을 더 할당받고자 할 때
이럴 때 page_fault가 발생하게 되고, frame을 할당해줘야 하는 위의 세가지 경우에는 frame을 할당받고 매핑해준다.
page_fault가 발생하면, spt(page를 모아둔 해시 테이블)에서 page를 찾고, vm_do_claim_page() 함수를 호출한다. 이 함수에서는 새로운 frame을 할당받고, pml4에 매핑해주고, swap_in 한다. swap_in을 하면 page를 만들때 지정했던 initialize 함수를 실행하고 지정했던 init 함수(lazy_load 함수)를 실행하면 lazy_loading이 완료된다.
+ memory_mapped_files 까지 구현했는데, 모든 테스트케이스에서 랜덤으로 하나씩 fail이 나오는 상황이 자꾸 발생했다. 그래서 file 관련 함수에는 모두 lock을 걸어주었고, frame_list도 모든 쓰레드에서 전역으로 사용하는 리스트기 때문에 frame_lock을 만들어 리스트를 접근할 때 모두 lock을 걸어주었다. frame_lock을 건 이후에는 좀 더 안정적으로 pass되는 것을 확인했는데, 그래도 희박한 확률로 랜덤으로 하나씩 fail이 뜨는 경우가 있다. 이건 나중에 다시 또 봐야지,,,
'정글' 카테고리의 다른 글
정글 [week11] Pintos-KAIST Project 3 :: VIRTUAL MEMORY - 2 (1) | 2024.05.27 |
---|---|
정글 [week08] Pintos-KAIST Project 2 :: USER PROGRAMS (0) | 2024.05.14 |
정글 [week07] Pintos-KAIST Project 1 :: Alarm Clock (0) | 2024.04.27 |
[정글 WEEK00] 개발일지 - 정글러 동선 (2) | 2024.03.17 |