메모리 swapping은 물리 메모리의 사용을 최대화하는 메모리 회수 기술이다. 메인 메모리의 frame이 할당되면 시스템은 사용자 프로그램으로부터 메모리 할당 요청을 더 이상 처리할 수 없다. 한 가지 솔루션은 현재 사용되고 있지 않은 메모리 프레임을 디스크로 swap out 시키는 것이다. 이것은 일부 메모리 자원을 해제하고 다른 어플리케이션에 사용할 수 있게 만들어준다.
swapping은 OS에 의해 이뤄진다. 시스템이 run out of memory(메모리 부족)을 감지한 상황에서 메모리 할당 요청을 받았을 때, 시스템은 디스크로 swap시키기 위해 제거할 페이지를 선택한다. 그리고 메모리 프레임의 정확한 상태가 디스크에 복사된다. 프로세스가 swapped out된 페이지에 접근하려고 시도할 때, OS는 정확한 내용을 메모리로 다시 가져와 페이지를 복구한다.
제거를 위해 선택한 페이지는 anonymous 혹은 file-backed page일 수 있다. 이 섹션에서, 우리는 각 케이스별로 다룰 것이다
모든 swapping 동작은 명시적으로 호출되지 않고 함수 포인터를 통해 이뤄진다. 이 함수 포인터는 struct page_operations file_ops
구조체 내 멤버이며, 이들은 각 페이지의 초기화 프로그램에 대한 동작으로 등록된다.
vm/anon.c
에 있는 vm_anon_init
과 anon_initializer
를 수정해라. anonymous page는 어떤 백업 공간도 갖고 있지 않다. anonymous page를 swapping하는 것을 지원하기 위해, 우리는 swap disk라고 하는 임시 backing storage를 제공한다. 우리는 이 swap disk를 이용해 anonymous page에 대한 swap을 구현한다.
void vm_anon_init (void);
이 함수에서, 우리는 swap disk를 셋업할 필요가 있다. 우리는 또한 스왑 디스크에서 사용 중인 & free인 공간을 관리할 자료구조를 필요로 한다. swap area는 PGSIZE의 단위(4096 bytes)로 관리된다.
bool anon_initializer (struct page *page, enum vm_type type, void *kva);
이 함수는 anonymous page에 대한 초기화 프로그램(initializer)이다. 우리는 swapping을 지원하기 위해 일부 정보를
anon_page
에 추가할 필요가 있다.
이제, anon_swap_in과 anon_swap_out을 구현해 anoymous page에 대한 swapping을 지원해라. 페이지는 swap in/out을 필요로 하기에, 우리는 anon_swap_in을 구현하기 전에 anon_swap_out을 구현해야 할 것이다. 우리는 데이터 내용을 swap disk로 이동하고 메모리로 안전하게 가져올 필요가 있다.