PintOS Project3-5 Swap In/Out

정글일지 40

Swap In/Out

개념

메모리 스와핑은 물리 메모리 사용을 극대화시키기 위한 기법이다. 메인 메모리의 프레임이 할당되면, 시스템은 더 이상 유저프로그램이 요청한 메모리 할당 요청을 처리할 수 없다. 해결책 중 하나는 현재 사용되고 있지 않은 메모리 프레임을 디스크로 ‘swap out’하는 것이다. 이로서 메모리 자원을 free할 수 있고 이는 다른 application이 활용할 수 있다.

스와핑은 운영체제가 한다. 시스템이 메모리가 부족한데 메모리 할당 요청을 받으면, 디스크를 swap하기 위해 evict할 페이지를 선택한다. 그 후, 메모리 프레임의 정확한 state는 디스크에 복사된다. 프로세스가 swap out된 페이지에 접근하려고 하면, 운영체제는 메모리로 다시 정확한 컨텐츠를 되가져와서 페이지를 복구한다.

스와핑 operation은 명시적으로 호출되지 않고, 함수 포인터로 호출된다. struct page_operation file_ops의 member로 구성되어 있고, 각 페이지의 initializer를 위한 operation이 된다.

해야할 것

Anonoymous Page

vm-anon_initanon_initializer를 수정해야 한다. Anonymopus page는 백업 저장소(backing storage)가 없다. anonymous page의 swapping을 위해서 임시적인 backing 백업저장소를 구성해야 하는데, 이를 swap disk라고 부른다. anonymous page의 swap 실행을 위한 swap disk를 구현해야 한다.

void vm_anon_init(void);

이 함수에서, swap disk를 설정해야 한다. swap disk에서 사용 구역과 free한 구역을 관리하기 위한 데이터 구조도 설정해야 한다. swap area는 또한 PGSIZE(4096 bytes) 단위로 관리되야 한다.

bool anon_initializer(struct page *page, enum vm_type type, void *kva);

anoqnymous page를 위한 initializer이다. anon_page에 swapping을 위한 정보를 추가해야 한다.

anonymous page의 swapping을 위해서 anon_swap_inanon_swap_out을 실행해야 한다. 페이지가 swapped in 되기 전 swapped out되야 하기 때문에 anon_swap_in실행 전에 anon_swap_out을 우선적으로 실행한다. 데이터 컨텐츠를 swap dsik로 이동시키고, 다시 온전하게 메모리로 되가져와야 한다.

static bool anon_swap_in(struct page *page, void *kva);

anonymous page를 디스크의 데이터 컨텐츠를 읽는 방식을 통해 swap disk에서 memory로 swap in 해야한다. 데이터의 위치는 페이지가 swap out될 때 페이지 구조체에 저장되었던 swap disk이다. swap table도 업데이트 해야한다.

static bool anon_swap_out(struct page *page);

메모리의 컨텐츠를 복사하는 방식으로 anonymous page를 swap disk에서 disk로 swap out해야 한다. 우선 swap table을 활용하여 디스크의 free swap slot을 찾고, slot에 데이터 페이지를 복사해 넣어야 한다. 데이터의 위치는 페이지 구조체에 저장되더야 한다. 디스크에 가용 slot이 없다면, kernel을 panic 해야 한다.

File-Mapped Page

file-backed page의 컨텐츠가 파일에서 오기 때문에, mmaped file은 backing store로 사용되야 한다. 즉, file-backed page를 내쫒을 때(evict) mapping 해왔던 파일에 다시 옮겨 적어야 한다.

static bool file_backed_swap_in(struct page *page, void *kva);

kva 주소의 페이지를 파일의 컨텐츠를 읽는 방식으로 swap in 해야 한다. file system과 동기화(synchronize) 해야 한다.

static bool file_backed_swap_out(struct page *page);

파일에 다시 되 적는 방법으로 페이지를 swap out해야 한다. 우선 페이지가 dirty인지 확인해야 한다. dirty가 아니라면, 파일의 컨텐츠를 수정할 필요가 없다. 페이지를 swap out한 후, 페이지의 dirty bit를 종료해야 한다.