-
[SW 정글 80일차] Project 3 - Anonymous Page기타/SW 사관학교 정글 2021. 10. 22. 02:01
오늘은 memory management 과제를 마무리하고 Anonoymous Page 과제를 이해하며 중간까지 구현을 완료했다.
너무 어렵다....
일단은 지금까지 한 것은 이해했는데 시간이 꽤 걸렸다.
1. Anonymous Page
Anonymous page는 매핑할 backing file이나 device가 없다.
anonymous라고 부르는 이유는 해당 page가 어떠한 이름을 가지고 있는 file source를 가지고 있는 것이 아니기 때문이다. anonymous page는 스택이나 힙영역에서 사용된다.
2. Page Initialization with Lazy Loading
Lazy loading은 메모리 로딩이 필요한 시점까지 지연되는 설계방식이다.
page가 할당되어도 연결된 물리 프레임이 없고 페이지의 실제 내용은 아직 로드되지 않은 것이다.
page fault로 signal을 보내어 page가 진짜 필요할 때 내용이 로드된다.
page에는 3가지 타입이 존재하고 각가의 페이지 타입별로 초기화하는 과정은 다르다.
첫번째로, 새로운 페이지를 요청할 때 호출되는 vm_alloc_page_with_initializer가 있다.
vm_alloc_page_with_initializer은 페이지 구조를 할당하고 페이지 유형에 따라 적절한 initializer를 설정하여 새 페이지를 초기화하고 컨트롤을 다시 사용자 프로그램으로 반환한다.
사용자 프로그램이 실행되면서 어느 시점에 아직 내용이 없는 페이지에 액세스하려고 하기 때문에 페이지 폴트가 발생하게 된다.
오류 처리 절차 중에 uninit_initialize가 호출된다.
static bool uninit_initialize (struct page *page, void *kva) { struct uninit_page *uninit = &page->uninit; /* Fetch first, page_initialize may overwrite the values */ vm_initializer *init = uninit->init; void *aux = uninit->aux; /* TODO: You may need to fix this function. */ return uninit->page_initializer (page, uninit->type, kva) && (init ? init (page, aux) : true); } /* Uninitlialized page. The type for implementing the * "Lazy loading". */ struct uninit_page { /* Initiate the contets of the page */ vm_initializer *init; enum vm_type type; void *aux; /* Initiate the struct page and maps the pa to the va */ bool (*page_initializer) (struct page *, enum vm_type, void *kva); };
uninit_initialize함수를 보면 인자로 받은 page struct에서 uninit 멤버를 불러온다.
uninit_page stuct에는 페이지를 초기화해줄 요소를 가지고 있다. (vm_initializer, vm_type 등)
즉, 처음 새로운 페이지가 만들어질 때 anon인지 file_backed인지 저장을 하고 page fault가 나면 설정한 이니셜라이저를 호출한다.
anon type이면 anon_initializer를 file_backed이면 file_backed_initializer를 호출한다.
3. Lazy Loading for Executable
lazy loading에서는 프로세스가 실행될 때 지금 당장 필요한 메모리 부분만 메인 메모리에 로드된다.
lazy loading은 모든 바이너리 이미지를 한 번에 메모리에 로드하는 Eager loading에 비해 오버헤드를 줄일 수 있다.
모든 페이지는 처음에 VM_UNINIT페이지로 생성되고 초기화되지 않은 페이지에 대한 페이지 구조, struct uninit_page가 구현되어있다.
page fault가 발생하면 page fault handler는 제어를 vm_try_handle_fault로 넘기고 유효한 page fault인지 검사를 먼저 한다.
해당 fault가 bogus fault(해결이 가능한 fault)이면 페이지에 내용을 로드해주고 유저 프로그램에게 제어권을 넘겨준다.
bogus page fault에는 lazy-loaded, swaped-out page, and write-protected page 3가지가 존재하고 lazy-loaded를 제외한 2가지는 나중에 나오는 과제에서 배울 수 있다.
lazy laod로 인한 page fault를 제대로 동작하기 위해 우리가 구현해야할 함수는 아래와 같다.
/* 인자로 받은 type으로 uninitialized page을 생성하는 역할을 함 * uninit page의 swap_in handler가 자동으로 type에 따라서 page를 초기화한다. * 그리고 INIT함수를 AUX와 함꼐 호출한다. * 한번 page를 생성하면 해당 page를 프로세스의 spt에 넣어준다. */ bool vm_alloc_page_with_initializer (enum vm_type type, void *va, bool writable, vm_initializer *init, void *aux); /* 처음 fault가 발생한 page를 초기화해주는 역할을 한다. */ static bool uninit_initialize (struct page *page, void *kva); /* anonymous page subsystem을 초기화해주는 역할을 한다.*/ void vm_anon_init (void); /* page 구조체에서 operations멤버에 담기는 anonymous page를 위한 handler를 set up해주는 함수이다. * anonymous pages를 위한 initializer로 사용된다. */ bool anon_initializer (struct page *page,enum vm_type type, void *kva);
[오늘의 나는 어떘을까?]
오늘은 기강확립 스터디를 위해 아침 7시 50분까지 갔어야했는데 아침에 기상했는데 움직일 몸이 아니였다.
머리가 어지럽고 힘이 나지 않았다.
그래서 더 자야겠다는 마음을 먹고 다시 누었는데 잠을 오래 잔 것이 익숙치 않아 계속 깼고 그때마다 그냥 일어나서 씻고 갈까?라는 고민을 했는데 그냥 일단은 9시 30분까지 더 잤다.
그래야지 일어나서 제대로 된 컨디션으로 공부를 할 수 있을 것 같았다.
강의실에 와서는 괜찮은 컨디션이였지만 시간이 지날 수록 몸에 힘이 없고 피곤함이 느껴졌다.
그냥 오늘 쉴까라는 고민을 했지만 그래도 버티며 공부를 이어갔고 저녁을 먹고 동료와 같이 계단을 걷고 나니 조금 괜찮아졌다.
운동 부족이여서 그런가...
정글에 들어오기 전에는 정말 미친듯이 농구를 해서그런지 정글에 와서 초반에 잠을 줄인 생활에서 버틸만했는데 이제는 체력이 다 떨어진 것같다.
체력을 기르기 위해 계단오르기라도 해야겠다.
'기타 > SW 사관학교 정글' 카테고리의 다른 글
[SW 정글 82일차] Project 3 - Stack Growth (0) 2021.10.24 [SW 정글 81일차] 오늘 한 일 (0) 2021.10.23 [SW 정글 79일차] Project 3 - Hash Table을 쓰네 (2) 2021.10.21 [SW 정글 78일차] Project 3 - Memory Management (0) 2021.10.20 [SW 정글 77일차] 기존 페이징 기법의 문제 해결하기 (0) 2021.10.19