PintOS project.3-2

신병규·2023년 5월 23일
0
post-custom-banner

Anonymous Page

  • uninit_page: 이 유형의 페이지는 초기화되지 않았음을 나타냅니다. 이는 페이지가 아직 실제 메모리에 매핑되지 않았거나, 페이지가 아직 사용되지 않았음을 의미합니다. 이러한 페이지는 필요에 따라 실제 메모리에 매핑되거나, 데이터를 저장하도록 초기화될 수 있습니다.
  • anon_page: 'anonymous page'의 줄임말로, 이름이 없는 페이지를 의미합니다. 이 유형의 페이지는 주로 프로세스가 동적으로 할당한 메모리(heap) 또는 스택 메모리를 저장하는 데 사용됩니다. 이러한 페이지는 파일과 연관되지 않으며, 프로세스의 실행 중에 생성되고 삭제됩니다.
  • file_page: 이 유형의 페이지는 파일의 내용을 저장합니다. 이는 프로세스가 파일의 내용을 메모리에 매핑할 때 사용되며, 파일의 특정 부분을 가상 메모리 주소에 직접 매핑하는 'memory-mapped file' 기능에 사용됩니다. 'file_page'는 'file-backed page'라고도 불립니다.

⇒ 각 페이지 마다 초기화 루틴이 다름

Suspended State

  • 메모리를 할당 받지 못한 상태
    • memory image를 swap device애 보관
    • 커널 또는 사용자에 의해 발생
  • Swap-out(suspended), Swap-in(resume)

bogus fault

가상 메모리에서 페이지 폴트(page fault)를 다루는 과정

  1. Lazy-loaded pages: 이 경우는 실제로 접근되기 전까지 페이지가 메모리에 로드되지 않습니다. 이러한 방식을 사용하면, 실제로 필요하지 않은 데이터를 메모리에 로드하는 것을 피할 수 있습니다. 이를 '지연 로드(lazy loading)'라고 부릅니다. 예를 들어, 프로그램이 실행되면, 운영 체제는 일반적으로 실행 가능한 모든 코드를 메모리에 로드하지 않습니다. 대신, 코드가 실제로 필요한 경우에만 해당 페이지를 메모리에 로드합니다. 이 경우 페이지 폴트가 발생하면, 운영 체제는 필요한 페이지를 디스크에서 찾아 메모리에 로드하고, 프로그램을 계속 실행합니다.
  2. Swapped-out pages: 페이지 교체 정책에 따라, 일부 페이지는 메모리 부족 시 디스크로 '스왑아웃'될 수 있습니다. 이렇게 하면 메모리를 더 효율적으로 사용할 수 있습니다. 스왑아웃된 페이지에 대한 접근이 발생하면, 운영 체제는 해당 페이지를 디스크에서 다시 메모리로 가져오는 '스왑인' 작업을 수행하며, 이 과정에서 페이지 폴트가 발생합니다.
  3. Write-protected pages: 일부 페이지는 쓰기 보호될 수 있습니다. 즉, 이러한 페이지에 대한 쓰기 시도는 페이지 폴트를 발생시킵니다. 이러한 페이지 폴트는 보통 운영 체제가 페이지를 쓰기 가능 상태로 변경하는 데 사용됩니다. 쓰기 보호는 다양한 목적으로 사용될 수 있습니다. 예를 들어, 'copy-on-write' 전략에서는 공유 페이지가 수정될 때 복사본을 만들어 원래의 페이지를 보호하는 데 쓰기 보호를 사용합니다.

⇒ 이러한 폴트는 'bogus' 또는 잘못된 것이 아니라 운영 체제가 가상 메모리를 효율적으로 관리하는 방법의 일부입니다.


Swap In / Out


스왑 공간은 가상 메모리의 일부를 디스크에 저장하는 공간입니다. 가상 메모리는 물리적인 메모리와 스왑 공간 간의 데이터 이동을 통해 필요한 메모리를 관리합니다. 이를 통해 유한한 물리적인 메모리와 디스크 공간을 최대한 활용하면서 메모리 부족 상황을 관리할 수 있습니다. 스왑 공간은 메모리 관리와 성능 향상을 위해 중요한 역할을 합니다.

Swap In

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 out

메모리가 가득 찼을 때, 운영체제가 선택한 메모리 페이지를 디스크의 '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 함수가 호출되며, 스왑 슬롯을 할당하여 페이지의 내용을 복사하고, 페이지 테이블 엔트리와 스왑 테이블을 업데이트하여 페이지의 스왑 아웃을 표시합니다. 이를 통해 해당 프레임은 다른 페이지에 할당되어 메모리의 사용을 최적화합니다.

post-custom-banner

0개의 댓글