uninit_page
: 이 유형의 페이지는 초기화되지 않았음을 나타냅니다. 이는 페이지가 아직 실제 메모리에 매핑되지 않았거나, 페이지가 아직 사용되지 않았음을 의미합니다. 이러한 페이지는 필요에 따라 실제 메모리에 매핑되거나, 데이터를 저장하도록 초기화될 수 있습니다.anon_page
: 'anonymous page'의 줄임말로, 이름이 없는 페이지를 의미합니다. 이 유형의 페이지는 주로 프로세스가 동적으로 할당한 메모리(heap) 또는 스택 메모리를 저장하는 데 사용됩니다. 이러한 페이지는 파일과 연관되지 않으며, 프로세스의 실행 중에 생성되고 삭제됩니다.file_page
: 이 유형의 페이지는 파일의 내용을 저장합니다. 이는 프로세스가 파일의 내용을 메모리에 매핑할 때 사용되며, 파일의 특정 부분을 가상 메모리 주소에 직접 매핑하는 'memory-mapped file' 기능에 사용됩니다. 'file_page'는 'file-backed page'라고도 불립니다.⇒ 각 페이지 마다 초기화 루틴이 다름
가상 메모리에서 페이지 폴트(page fault)를 다루는 과정
⇒ 이러한 폴트는 'bogus' 또는 잘못된 것이 아니라 운영 체제가 가상 메모리를 효율적으로 관리하는 방법의 일부입니다.
스왑 공간은 가상 메모리의 일부를 디스크에 저장하는 공간입니다. 가상 메모리는 물리적인 메모리와 스왑 공간 간의 데이터 이동을 통해 필요한 메모리를 관리합니다. 이를 통해 유한한 물리적인 메모리와 디스크 공간을 최대한 활용하면서 메모리 부족 상황을 관리할 수 있습니다. 스왑 공간은 메모리 관리와 성능 향상을 위해 중요한 역할을 합니다.
swap 영역에 있는 페이지를 메모리로 다시 불러오는 과정으로, 프로세스가 swap 영역에 있는 페이지를 요청하면, 운영체제는 그 페이지를 메모리로 불러와서 프로세스에 제공합니다.
핀토스에서 아래의 순서로 진행됩니다
vm_try_handle_fault ⇒ vm_claim_page ⇒ vm_do_caim_page ⇒ swap_in
‘Swap In’의 첫 시작은 vm_try_handle_fault() 입니다. 만약 해당 페이지가 존재하지 않으면 스택 확장 등의 추가 작업을 수행하고 페이지를 확보하기 위해 vm_claim_page 함수를 호출합니다.
vm_claim_page 함수는 주어진 가상주소 ‘va’에 할당된 페이지를 요청하는 기능을 수행합니다. vm_do_claim 함수의 반환값을 그대로 반환하여 페이지 할당 작업의 성공 여부를 표시합니다.
해당 함수는 프레임을 가져오기 위해 vm_get_frame 함수를 호출하고 가져온 프레임과 페이지를 연결합니다. 이후 페이지 테이블 엔트리에 페이지의 가상 주소(VA)와 프레임의 물리 주소(PA)를 매핑하기 위해 pml4_set_page 함수를 호출합니다. 만약 매핑에 실패하면 페이지 할당을 해제하고 false를 반환합니다. 그렇지 않으면 swap_in 함수를 호출하여 스왑 영역에서 페이지를 가져와 메모리로 로드합니다.
swap_in 함수는 스왑 영역에 저장된 페이지를 메모리로 로드하는 과정을 수행합니다. 이 과정에서 anon_swap_in 또는 file_backed_swap_in 함수가 호출됩니다.
anon_swap_in은 익명 페이지를 스왑 인하여 메모리에 로드하고, file_backed_swap_in은 파일 지원 페이지를 스왑 인하여 메모리에 로드합니다. 페이지의 내용을 복사하고 페이지 테이블 엔트리와 스왑 테이블을 업데이트하여 페이지가 메모리에 스왑 인되었음을 표시합니다. 이후 해당 페이지에 액세스할 수 있게 됩니다.
메모리가 가득 찼을 때, 운영체제가 선택한 메모리 페이지를 디스크의 'swap' 영역으로 옮기는 과정입니다. 이로써 메모리 공간을 확보하여 새로운 프로세스나 데이터를 불러올 수 있게 됩니다.
vm_get_frame ⇒ vm_evict_frame ⇒ vm_get_victim ⇒ swap_out
vm_get_frame 함수는 페이지를 할당하기 위해 사용 가능한 프레임을 가져오는 과정을 수행합니다.
위 함수 내부에 vm_evict_frame 함수를 호출하여 필요에 따라 페이지를 스왑 아웃하고 해당 프레임을 반환합니다.
또한 vm_get_victim 함수를 호출하여 스왑 아웃할 페이지의 프레임을 선택합니다.
선택된 프레임을 스왑 아웃하기 위해 스왑 아웃 함수를 호출하고 해당 프레임을 반환합니다.
swap_out 함수는 페이지를 스왑 아웃하여 메모리에서 해제하고, 해당 페이지를 스왑 영역에 저장하는 역할을 합니다.
이 과정에서 anon_swap_out 또는 file_backed_swap_out 함수가 호출되며, 스왑 슬롯을 할당하여 페이지의 내용을 복사하고, 페이지 테이블 엔트리와 스왑 테이블을 업데이트하여 페이지의 스왑 아웃을 표시합니다. 이를 통해 해당 프레임은 다른 페이지에 할당되어 메모리의 사용을 최적화합니다.