Swap In/Out
메모리 스왑은 물리적 메모리 사용량을 최대화하기 위한 메모리 회수 기술입니다. 주 메모리의 프레임(frames)이 할당되면 시스템은 사용자 프로그램의 메모리 할당 요청을 더 이상 처리할 수 없습니다. 한 가지 해결책은 현재 사용되지 않는 메모리 프레임을 디스크에 스왑아웃하는 것입니다. 이렇게 하면 일부 메모리 리소스를 확보하여 다른 애플리케이션에서 사용할 수 있습니다.
스왑은 운영 체제에서 수행합니다. 시스템이 메모리가 부족하다는 것을 감지하고 메모리 할당 요청을 받으면 디스크 스왑을 위해 퇴거할 페이지를 선택합니다. 그런 다음 메모리 프레임의 정확한 상태가 디스크에 복사됩니다. 프로세스가 스왑아웃된 페이지에 액세스하려고 하면 OS는 정확한 콘텐츠(the exact content)를 메모리로 다시 가져와서 페이지를 복구합니다.
퇴출을 위해 선택한 페이지는 익명 페이지(anonymous page) 또는 파일 백업 페이지(file-backed page)일 수 있습니다. 이 섹션에서는 각 사례를 처리합니다.
모든 스와핑 연산은 명시적으로 호출되지 않고 함수 포인터(function pointers)로 호출됩니다. 이러한 오퍼레이션은 각 페이지의 이니셜라이저에 대한 오퍼레이션으로 등록되는 구조체 page_operations file_ops (struct page_operations file_ops)의 멤버입니다.
Anonymous Page
Modify <vm_anon_init()> and <anon_initializer()> in <vm/anon.c>. 익명 페이지에는 백업 스토리지가 없습니다. 익명 페이지(anonymous page)의 스왑을 지원하기 위해 스왑 디스크(swap disk)라는 임시 백업 스토리지를 제공합니다. 익명 페이지에 대한 스왑을 구현할 때 스왑 디스크(swap disk)를 활용하게 됩니다.
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을 구현하는 것이 좋습니다. 데이터 내용을 스왑 디스크로 이동한 후 안전하게 메모리로 다시 가져와야 합니다.
static bool anon_swap_in (struct page *page, void *kva);
- 디스크에서 메모리로 데이터 내용을 읽어 스왑 디스크에서 익명 페이지로 스왑합니다. 데이터의 위치는 페이지가 교체될 때 페이지 구조체에 저장되어 있어야 하는 스왑 디스크입니다. 스왑 테이블을 업데이트하는 것을 잊지 마세요(스왑 테이블 관리 참조 Managing the Swap Table).
static bool anon_swap_out (struct page *page);
- 메모리에서 디스크로 내용을 복사하여 익명 페이지를 스왑 디스크로 swap-out 합니다. 먼저 스왑 테이블을 사용하여 디스크에서 사용 가능한 스왑 슬롯을 찾은 다음 데이터 페이지를 해당 슬롯에 복사합니다. 데이터의 위치는 페이지 구조체(page struct)에 저장되어야 합니다. 디스크에 더 이상 여유 슬롯이 없으면 커널을 패닉( panic )시킬 수 있습니다.
File-Mapped Page
파일 백업 페이지의 콘텐츠는 file에서 가져오기 때문에 mmaped file을 백업 저장소로 사용해야 합니다. 즉, 파일 백업 페이지(file-backed page)를 내보내면 매핑된 파일에 다시 기록됩니다(That is, evicting a file-backed page writes it back to the file it was mapped from. 해석 보충하도록 하자). vm/file.c에서 file_backed_swap_in, file_backed_swap_out을 구현합니다. 당신의 설계에 따라 file_backed_init 및 file_initializer를 수정할 수 있습니다.
static bool file_backed_swap_in (struct page *page, void *kva);
- 파일에서 내용을 읽어와서 kva에서 페이지를 Swaps in 합니다. 파일 시스템과 동기화해야 합니다.
static bool file_backed_swap_out (struct page *page);
- 파일에 내용을 다시 써서 페이지를 Swaps out 합니다. 먼저 페이지가 더럽지 않은지(dirty 인지 아닌지) 확인하는 것이 좋습니다. 페이지가 더럽지 않다면(If it is not dirty) 파일의 내용을 수정할 필요가 없습니다. 페이지를 swap out 한 후에는 해당 페이지의 더티 비트를 꺼야 한다는 점을 잊지 마세요.
'크래프톤 정글 > 핀토스(week08-13)' 카테고리의 다른 글
Project 1 : Threads - Alarm Clock( 수정중) (0) | 2023.06.23 |
---|---|
Project 1 : Threads - Introtuction (급조번역(23.6.22).신용하지 말것- 수정중) (0) | 2023.06.23 |
Project 3 : Virtual Memory - Memory Mapped Files (기입완료-수정중) (0) | 2023.06.21 |
Project 3 : Virtual Memory - Stack Growth (기입완료-수정중) (0) | 2023.06.20 |
Project 3 : VIRTUAL MEMORY - Anonymous Page(기입 완료- 수정중) (0) | 2023.06.17 |