PintOS project.3-1

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

Virtual Memory

가상 메모리는 컴퓨터 시스템의 메모리 관리 기법 중 하나로, 물리적 메모리의 용량을 초과하는 양의 메모리를 프로그램에 제공하는 데 사용됩니다.
이는 프로그램에 대해 연속적이며 완전한 메모리 공간을 제공하는 동시에, 실제 물리적 메모리는 필요에 따라 여러 프로그램 사이에서 공유될 수 있습니다.

Memory Management

멀티 레벨 페이지 테이블 구조

핀토스는 멀티레벨 페이지 테이블 구조를 사용하여 가상 메모리와 물리 메모리 간의 매핑을 구현하고 있습니다. 이러한 구조의 중심에는 Thread 구조체의 pml4라는 멤버가 위치하고 있습니다. 이 pml4 멤버는 페이지 테이블의 최상위 계층인 pml4 테이블을 가리키는 포인터입니다.

PML4

63          48 47            39 38            30 29            21 20         12 11         0
+-------------+----------------+----------------+----------------+-------------+------------+
| Sign Extend |    Page-Map    | Page-Directory | Page-directory |  Page-Table |    Page    |
|             | Level-4 Offset |    Pointer     |     Offset     |   Offset    |   Offset   |
+-------------+----------------+----------------+----------------+-------------+------------+
              |                |                |                |             |            |
              +------- 9 ------+------- 9 ------+------- 9 ------+----- 9 -----+---- 12 ----+
                                          Virtual Address

pml4는 4단계로 이루어진 페이지 테이블 구조로서, 각 단계가 트리 구조를 형성하며 연결되어 있습니다.
이 과정은 가상 주소, 즉 Virtual Page Number와 Virtual Page Offset을 사용하여 다음 단계로 진행되며, 이를 통해 최종적으로 물리 메모리에 도달하게 됩니다. 이렇게 도달한 물리 메모리에서는 원하는 데이터를 읽어올 수 있습니다.

메모리 접근 요청이 있을 때, 페이지 테이블에서 해당 가상 주소에 대응하는 물리 주소를 찾게 됩니다. 이때, 페이지 테이블에서 해당 정보를 찾을 수 있다면, 이를 페이지 적중이라고 하며, 이를 통해 원하는 물리 주소에 접근할 수 있게 됩니다.

하지만, 언제나 페이지 적중이 일어나는 것은 아닙니다. 프로세스가 현재 메모리에 존재하지 않는 페이지를 액세스하려 할 때, 즉 페이지 테이블에서 해당 페이지에 대한 정보를 찾을 수 없을 때, 페이지 폴트가 발생합니다. 이런 경우에는 보조 페이지 테이블, 즉 Supplemental Page Table이 활용됩니다.

supplemental page table

Thread 구조체 안에는 supplemental page table을 구현하기 위한 hash 구조체가 있습니다. 이 hash 구조체에는 buckets라는 연결 리스트가 존재하며, 이 리스트는 여러 개의 bucket을 담고 있습니다. 각 bucket은 hash_elem 구조체의 list_elem으로 구성된 연결 리스트입니다.

이렇게 hash_elem 구조체는 page 구조체를 상속받아, 가상 주소를 키로 사용하여 물리 주소를 찾을 수 있습니다. 즉, 보조 페이지 테이블에서는 가상 주소를 이용하여 해당 주소가 참조하고 있는 물리 주소를 찾을 수 있게 됩니다. 이렇게 보조 페이지 테이블은 가상 메모리와 물리 메모리 사이의 매핑을 보조하는 중요한 역할을 수행하게 됩니다.

하지만 이 과정도 항상 성공적으로 이루어지는 것은 아닙니다. 만약 요청한 가상 주소에 대응하는 물리 주소를 찾지 못한다면, 이는 페이지 폴트로 이어지게 됩니다. 페이지 폴트는 CPU가 메모리에 접근하려 할 때 해당 페이지가 물리 메모리에 존재하지 않아 발생하는 상황을 말합니다. 이런 경우, 운영체제는 페이지 폴트 핸들러를 통해 이를 처리하게 됩니다.

페이지 폴트 핸들러는 페이지 폴트가 발생한 원인을 파악하고 적절한 처리를 수행합니다. 만약 페이지 폴트가 발생한 원인이 메모리에 존재하지 않는 페이지에 접근하려한 것이라면, 핸들러는 해당 페이지를 메모리로 로드합니다. 그리고 페이지 테이블을 업데이트하여 가상 주소와 물리 주소가 올바르게 매핑되도록 합니다.

반면, 페이지 폴트가 발생한 원인이 권한 문제 등 다른 이유라면, 핸들러는 적절한 예외 처리를 수행하게 됩니다. 이처럼 페이지 폴트 핸들러는 메모리 관리의 중요한 부분을 담당하고 있습니다.

페이지 폴트

메모리에 존재하지 않는 페이지를 액세스하려 할 때, 즉 페이지 테이블에서 해당 페이지에 대한 정보를 찾을 수 없을 때, 페이지 폴트가 발생합니다. 이 때 보조 테이블이 사용됩니다. Thread 구조체의 supplemental page에 있는 hash 구조체의 buckets 리스트를 통해 필요한 정보를 얻을 수 있습니다.

페이지 폴트 핸들러

페이지 폴트가 발생하면, 해당 주소와 액세스 정보를 가지고 페이지 폴트 핸들러가 호출됩니다. 이 핸들러는 가상 메모리 관리 시스템이 메모리 액세스를 제어하고, 필요한 경우 페이지 로딩, 스왑 아웃 등의 작업을 수행합니다.

Demand Paging (요구 페이징)

가상 메모리에서 사용되는 기법으로, 실제로 필요한 페이지만 메모리에 적재하는 방식입니다. 프로세스가 시작될 때 모든 페이지를 메모리에 적재하는 대신, 필요한 페이지만 요청에 따라 메모리에 적재하고 사용하지 않는 페이지는 디스크의 스왑 영역에 저장됩니다. 이렇게 함으로써 메모리 사용량이 크게 줄어들고, 시스템의 메모리 사용 효율이 향상됩니다.

Memory Swap (메모리 스왑)

메모리 스왑은 가상 메모리에서 사용되는 메커니즘으로, 메모리가 부족할 때 물리적 메모리의 일부를 디스크의 스왑 영역으로 이동시켜 메모리 공간을 확보하는 과정입니다. 스왑 아웃(Swap Out)은 메모리에서 디스크로 데이터를 이동하는 과정이며, 스왑 인(Swap In)은 디스크에서 메모리로 데이터를 이동하는 과정입니다. 메모리 스왑을 사용함으로써 물리적 메모리보다 큰 가상 메모리를 사용할 수 있게 되며, 여러 프로세스를 동시에 실행할 수 있습니다.

post-custom-banner

0개의 댓글