미소를뿌리는감자의 코딩

[Pintos_project3 (13)] uninit_destory, anon_destory 본문

정글 일지

[Pintos_project3 (13)] uninit_destory, anon_destory

미뿌감 2024. 12. 2. 23:21
728x90

1. 개요

uninit_destory는 UNINIT된 페이지를 어떻게 destory할 것인가에 대한 함수이다.

anon_destory는 ANON type의 페이지를 어떻게 해제할 것인가를 다룬다.

해당 경우에는, 서로 가리키는 pointer를 null로 바꾸어주고, frame의 경우엔 free 해준다.

page는 추후에 caller가 free할 것이므로 free하지 않아도 된다.

 

2. 본문

재밌게도, uninit_destory는 주석에서 답을 주고 있다. 할게 없다면 return 해라... 라고 적혀있고 그대로 하면 된다.

// vm/uninit.c

static void
uninit_destroy (struct page *page) {
	struct uninit_page *uninit UNUSED = &page->uninit;
	/* TODO: Fill this function.
	 * TODO: If you don't have anything to do, just return. */
	/* pseudo
	 * page의 상태를 확인하고 UNINIT이라면, spt에서 해제시키면 되는 거 아닌가? -> 근데 그건 이미 spt_kill에서,,,하니까 그냥 return 만 하면 됨.*/
	return;
}

 페이지를 직접 해제하는 건 다른 함수가 할 예정이다.

 

anon_destory의 경우 주석으로 comment를 달아놓았다.

// vm/anon.c

/* Destroy the anonymous page. PAGE will be freed by the caller. */
static void
anon_destroy (struct page *page) {
	struct anon_page *anon_page = &page->anon;
	/* pseudo
	 * anon이 사용 중인 리소스 해제, page는 caller가 해제할 것이므로 신경 안써도 된다.
	 * anon이 사용 중인 frame, page를 해제*/

	if (page->frame) {
		list_remove(&page->frame->frame_elem); // 리스트에서 해당 frame 제거
		page->frame->page = NULL; // frame이 page를 가리키는 포인터 제거. NULL
		free(page->frame); // 이후, frame을 free
		page->frame = NULL; // page가 frame을 가리키는 포인터 제거. NULL
	}
}

 

3. 결과

테스트 결과는 54 of 141 tests failed로 동일하다.

728x90