가용 프레임이 존재하는 경우

대략적 흐름

page fault 발생
	-> handler 호출
		-> SPT에서 page 찾음
		-> vm_do_claim_page (페이지 할당)
		-> page와 frame 연결
		-> pml4에 VA → frame (매핑 등록)
		-> swap_in (데이터 적재)
	-> handler가 true 반환
같은 명령어를 다시 실행하면 이번에는 접근 성공

왜 page와 frame을 연결해야하나?

가용 프레임이 없는 경우

대략적 흐름

vm_do_claim_page 
	-> vm_get_frame (프레임 할당 후 반환)
		-> check palloc(PAL_USER) is NULL (사용할 수 있는 프레임이 없다면)
			-> if true, vm_evict_frame 
				-> vm_get_evict (무조건 프레임 하나 반환) with swap out
				-> 페이지 테이블 매핑 정보 삭제
				-> 페이지와 연결 제거
				-> 수정되었다면, 페이지 종류에 따라 저장 swap out
	-> 페이지와 프레임 연결
	-> 페이지 테이블에 매핑 정보 추가
	-> swap in (프레임에 데이터 불러들이기)

프레임 테이블이 필요하다

[내 생각]

핀토스는 1코어 1스레드 방식으로 동작한다. 따라서, 현재 프로세스가 사용하는 프레임 외에는 사용되고 있지 않다. 그래서 다른 프로세스의 프레임을 선택해 방출할 수 있어야, 현재 실행중인 프로세스가 잘 동작할 수 있다.

[피드백 with AI]

커널은 프레임을 프로세스의 입장이 아닌, 전체를 바라본다. 따라서 누구의 프레임보다는 전체 중에서 어떤 프레임을 비워주면 좋을지 레벨로 바라본다. 그래서 현재 프로세스뿐만 아니라 프레임 테이블을 이용해 선택하는게 맞다.

빈 프레임이 있는지는 어떻게 알 수 있지?