ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PintOS Project3 - Virtual Memory 3편 (미완)
    정글 크래프톤 5기 회고 및 정리/PintOS 2024. 6. 6. 21:41

    5. Swap In/Out

    - 메모리 스와핑은 물리 메모리의 사용 극대화하기 위한 메모리 회수 기술이다.
    - 주 메모리의 프레임이 할당되면, 시스템은 더 이상 사용자 프로그램으로부터의 메모리 할당 요청을 처리할 수 없다.
    - 하나의 해결책은 현재 사용되지 않고 있는 메모리 프레임을 디스크로 스왑아웃하는 것이다.
    - 이는 일부 메모리 자원을 해제하고 다른 애플리케이션에 사용할 수 있게 한다.

    - 스와핑은 운영체제에 의해 수행된다.
    - 시스템이 메모리가 부족하다고 판단하고 메모리 할당 요청을 받았을 때, 스왑 디스크로 이동시킬 페이지를 선택한다.
    - 그런 다음, 메모리 프레임의 정확한 상태를 디스크에 복사한다.
    - 프로세스가 스왑아웃된 페이지에 접근하려고 시도할 때, OS는 정확한 내용을 메모리로 다시 가져와 페이지를 복구한다.

    - 교체 대상으로 선택된 페이지는 익명 페이지나 파일 기반 페이지일 수도 있다.
    - 해당 섹션에서 각 경우를 처리할 것이다.
    - 모든 스와핑 작업은 명시적으로 호출되지 않고, 함수 포인터로 호출된다.
    - 이들은 각 페이지의 초기화에 대한 작업으로 등록될 struct page_oprations file_ops의 멤버이다.
    - 익명 페이지는 백업 스토리지가 없다.
    - 익명 페이지의 스와핑을 지원하기 위해, 우리는 스왑 디스크라고 불리는 임시 백업 스토리지를 제공한다.
    - 익명 페이지의 스왑을 구현하기 위해 스왑 디스크를 사용할 것이다.

     

    구현1

    void vm_anon_init (void);

    - 이 함수에서는 스왑 디스크를 설정해야 한다.

    - 또한 스왑 디스크의 빈 공간과 사용된 공간을 관리하는 데이터 구조가 필요하다.

    - 스왑 영역은 PGSIZE(4096 바이트)의 정밀도로 관리될 것이다.

     

    void
    vm_anon_init (void) {
        // Anonymous page의 subsystem을 초기화하는 함수
    
        /* Set up the swap_disk. */
        swap_disk = disk_get(1, 1);
    }
    disk_get

    - anonymous는 swap 관련이기에 1, 1

    구현2

    bool anon_initializer (struct page *page, enum vm_type type, void *kva);

    - 익명 페이지를 위한 초기화 함수이다.

    - 스와핑을 지원하기 위해 익명 페이지에 일부 정보를 추가해야 한다.

     


    - 이제 익명 페이지의 스와핑을 지원하기 위해 vm/anon.c에 anon_swap_in과 anon_swap_out 함수를 구현하라.
    - 페이지가 스왑인되기 위해서는 먼저 스왑아웃되어야 하므로, anon_swap_in을 구현하기 전에 anon_swap_out을 구현하는 것이 좋다.
    - 데이터 내용을 스왑 디스크로 이동시키고, 이를 안전하게 메모리로 다시 가져와야 한다.

     

    구현3

    static bool anon_swap_in (struct page *page, void *kva);

    - 스왑 디스크에서 익명 페이지를 메모리로 가져오는 작업은 디스크에서 데이터 내용을 읽어 메모리로 전송함으로써 이뤄진다.

    - 데이터의 위치는 페이지가 스왑 아웃될 때 페이지 구조체에 저장되어야 한다.

    - 스왑 테이블 업데이터를 기억하라(스왑 테이블 관리 참조)

     

     


    구현4

    static bool anon_swap_out (struct page *page);

    - 스왑 디스크로 익명 페이지를 스왑 아웃하기 위해 메모리에서 디스크로 내용을 복사한다.

    - 우선 스왑 테이블을 사용하여 디스크에서 빈 스왑 슬롯을 찾은 다음, 그 슬롯에 페이지 데이터를 복사한다.

    - 데이터의 위치는 페이지 구조체에 저장되어야 한다.

    - 디스크에 더 이상 빈 슬롯이 없다면 커널을 패닉시킬 수 있다.

     


    - 파일 기반 페이지의 내용은 파일에서 온 것이므로, 메모리 매핑된 파일을 백업 저장소로 사용해야 한다.
    - 즉, 파일 기반 페이지를 제거할 때는 그 페이지가 매핑된 파일에 다시 쓰여져야 한다.
    - vm/file.c 에 file_backed_swap_in, file_backed_swap_out을 구현하라.
    - 설계에 따라 file_backed_init 및 file_initializer를 수정할 수 있다.

     

    구현5

    static bool file_backed_swap_in (struct page *page, void *kva);

    - 페이지를 스왑 디스크에서 메모리의 특정 가상 주소(kva)로 읽어들이는 작업을 수행한다.

    - 이 과정에서 파일 시스템과의 동기화가 필요하다.

     

     

     


    구현6

    static bool file_backed_swap_out (struct page *page);

    - 페이지의 내용을 파일에 다시 써서 페이지를 스왑 아웃한다.

    - 먼저 페이지가 수정되었는지(dirty) 확인하는 것이 좋다.

    - 페이지가 수정되지 않았다면 파일의 내용을 수정할 필요가 없다.

    - 페이지를 스왑 아웃한 후, 페이지의 더티 비트(dirty bit)를 끄는 것을 잊지마라.

     


    6. Copy-on-Write (Extra)

    - Copy-on-write는 물리적 페이지의 동일한 인스턴스를 사용하여 더 빠른 복제 작업을 허용하는 리소스 관리 기술이다.

    - 어떤 리소스를 여러 프로세스가 사용하는 경우, 일반적으로 충돌이 발생하지 않도록 각 프로세스는 그 리소스의 자체 복사본을 가져야 한다.

    - 그러나 리소스가 수정되지 않고 읽기만 되는 경우, 물리적 메모리에 여러 복사본을 가질 필요가 없다.

     

    - 예를 들어, fork를 통해 새 프로세스가 생성된 경우를 생각해보자.

    - 자식은 부모의 리소스를 상속받기 위해 데이터를 가상 주소 공간에 복제해야 한다.

    - 일반적으로 가상 메모리에 내용을 추가하는 것은 물리적 페이지를 할당하고, 프레임에 데이터를 작성하고, 페이지 테이블에 가상→물리적 매핑을 추가하는 단계를 포함한다.

    - 이 단계들은 상당히 시간이 소요될 수 있다.

     

    - 그러나 copy-on-write 기술을 사용하면, 리소스의 새 복사본을 위해 새로운 물리적 페이지를 할당하지 않는다.

    - 이는 기술적으로 내용이 이미 물리적 메모리에 존재하기 때문이다.

    - 따라서 우리는 단지 자식 프로세스의 페이지 테이블에 가상→물리적 매핑을 추가하기만 하면 되며, 여기서 가상 주소는 이제 자식의 메모리 공간에 있다.

    - 그런 다음 부모와 자식은 동일한 물리적 페이지에서 동일한 데이터에 접근한다.

    - 그러나 여전히 별도의 가상 주소 공간을 통해 격리되어 있으며, OS만이 그들이 동일한 프레임을 참조하고 있다는 것을 알고 있다.

    - 공유된 리소스의 내용을 수정하려고 하는 프로세스가 있을 때만, 별도의 물리적 페이지에서 자신만의 별도 복사본을 만든다.

    - 따라서 실제 복사 작업은 첫 번째 쓰기 시점까지 연기된다.

     

    - 즉, OS는 copy-on-write 페이지에 대한 쓰기 시도를 감지할 수 있어야 한다.

    - 이 필요성을 달성하기 위해 OS는 "쓰기 방지" 메커니즘을 사용한다.

    - 이는 간단한 아이디어이다 : 쓰기 접근 시 페이지 폴트를 발생시킨다.

    - 이는 메모리 관리 시스템의 지원으로, 쓰기 방지된 페이지를 전혀 쓸 수 없도록 표시함으로써 쉽게 구현할 수 있다.

     

    - fork에 대해서만 copy-on-write를 구현할 필요가 있다.

    - 자식 프로세스가 부모 프로세스로부터 리소스를 상속받을 때, 자식이 수정을 시도하기 전까지는 동일한 물리적 데이터를 참조할 수 있다.

    - 모든 쓰기 방지 페이지는 추방 대상이다.

     

    - copy-on-write에 대한 기본 테스트 케이스만 제공된다.

    - 가능한 모든 경우를 고려해야 한다.

        · (힌트 : 파일 기반 페이지의 공유를 구현해야 한다)

     

     


    문제해결 출처

     

     

     

     

     

Designed by Tistory.