메모리 스와핑은 물리 메모리의 사용을 최대화하기 위한 메모리 재활용 기술입니다. 메인 메모리의 프레임이 할당되면 시스템은 사용자 프로그램으로부터 더 이상의 메모리 할당 요청을 처리할 수 없습니다. 한 가지 해결책은 현재 사용되지 않는 메모리 프레임을 디스크로 스왑 아웃하는 것입니다. 이렇게 하면 일부 메모리 리소스가 해제되어 다른 애플리케이션에서 사용할 수 있게 됩니다.
스와핑은 운영 체제에 의해 수행됩니다. 시스템이 메모리가 부족한 상태임을 감지했지만 메모리 할당 요청을 받으면 스왑 디스크로 내보낼 페이지를 선택합니다. 그런 다음 메모리 프레임의 정확한 상태가 디스크에 복사됩니다. 프로세스가 스왑 아웃된 페이지에 액세스하려고 하면 OS는 정확한 내용을 메모리로 다시 가져와 페이지를 복구합니다.
추출을 위해 선택된 페이지는 익명 페이지 또는 파일 백업 페이지일 수 있습니다. 이 섹션에서는 각 경우를 처리할 것입니다.
모든 스와핑 작업은 명시적으로 호출되지 않고 함수 포인터로 호출됩니다. 이들은 struct page_operations file_ops
의 멤버이며, 각 페이지의 초기화 작업으로 등록됩니다.
vm/anon.c
에서 vm_anon_init
과 anon_initializer
를 수정하세요. 익명 페이지에는 백업 저장소가 없습니다. 익명 페이지의 스와핑을 지원하기 위해 스왑 디스크라는 임시 백업 저장소를 제공합니다. 익명 페이지의 스왑을 구현하기 위해 스왑 디스크를 활용할 것입니다.
void vm_anon_init (void);
이 함수에서는 스왑 디스크를 설정해야 합니다. 또한 스왑 디스크의 여유 공간과 사용 중인 공간을 관리하는 데이터 구조가 필요합니다. 스왑 영역은 PGSIZE(4096바이트) 단위로 관리됩니다.
bool anon_initializer (struct page *page, enum vm_type type, void *kva);
이것은 익명 페이지의 초기화 함수입니다. 스와핑을 지원하기 위해
anon_page
에 일부 정보를 추가해야 합니다.
이제 vm/anon.c
에서 anon_swap_in
과 anon_swap_out
을 구현하여 익명 페이지의 스와핑을 지원하세요. 페이지를 스왑 인하려면 먼저 스왑 아웃해야 하므로 anon_swap_in
을 구현하기 전에 anon_swap_out
을 구현하는 것이 좋습니다. 데이터 내용을 스왑 디스크로 이동하고 안전하게 메모리로 다시 가져와야 합니다.