물리 메모리가 제한되어 있지만 많은 프로세스가 물리적 메모리를 사용하려한다. 물리적 메모리는 모든 프로세스의 페이지를 항상 저장할 만큼 크지 않은데 말이다.
해서 물리 메모리에 페이지가 필요하지 않으면 페이지를 "paged out"시킨다. 해당 페이지는 swap table 또는 file system에 기록한다.
반면, 프로세스에 페이지가 필요하고 물리 메모리에 없는 경우, 프로세스는 "paged in"한다.
이러한 방식으로 한정적인 물리 메모리를 운영할 것이다.
이번 proejct3 : VM 에서 생각해봐야할 것은
struct page
를 가상 주소에 연결합니다.struct page
는 정보를 반영한다. (struct page 위로 이동)struct page
를 할당한다고 해서 가상 주소에 물리적 프레임이 할당되는 것은 아니다.Q 프레임이 할당된 후 프레임의 내용을 어떻게 채울까?
페이지는 처음에 uninit_page로 시작하고,
anonymous memory 페이지는 anon_initializer되고
file-backed memory 페이지는 file_map_initializer된다.
supplemental page table
에서 가상 페이지를 검색하여 어떤 데이터가 어디에 있어야 하는지를 찾는다.Q. 모든 frame이 가득 찬 경우 페이지를 저장할 frame을 어떻게 얻을 수 있을까?
A. frame table에 의해 관리하여 제거한다.
Q. 페이지를 어떻게 제거할까?
A.
1) 페이지 교체 알고리즘을 사용하여 제거할 프레임을 선택한다.
2) frame을 참조하는 페이지 테이블을 제거한다. (only multiple references if implementing extra credit)
3) 필요한 경우, 파일 시스템에 페이지를 쓰거나 스왑한다.
CPU에서 설정한 accessed
와 dirty bit
를 활용한다.
추가 개념 정리
쉽게 말하면 게으른 로딩, 지연된 로딩으로 페이지를 읽어들이는 시점에 중요하지 않은 리소스 로딩을 추후에 하는 기술이다. 이 중요하지 않은 리소스들은 필요할 때 로드가 되야한다.
이는 예시로 이해가 더 쉬웠는데, 웹페이지 사용시 전체 페이지의 내용이 다운되어 랜더링된다. 이를 통해 브라우저는 웹페이지를 캐시할 수 있지만 사용자가 다운한 모든 콘텐츠를 실제로 볼 수 있다는 보장은 없다.
만약 전체 파일을 다운로드했지만 사용자가 첫번째 파일만 보고 떠난다면 웹페이지에서는 메모리 및 대역폭 낭비가 발생한다. 이런 낭비를 줄이기 위해 페이지에 접근할 때 모든 콘텐츠를 대량 로드하는 대신 사용자가 필요한 페이지의 일부에 접근할 때 콘텐츠를 load할 수 있게 하는 것이다.
요구 페이징이란 가상 메모리 관리 방법으로, 프로세스에서 사용할 메모리 페이지를 프로세스 생성 시에 모두 할당하지 않고, 필요할 때마다 동적으로 할당하는 것이다.
demand paging의 목적은 물리 메모리와 swap device 사이의 데이터 전송을 최소한으로 하기 위함이다. 좋은 MMU(메모리 관리 장치로, 가상 메모리 주소를 실제 메모리 주소로 변환하며, 메모리 보호, 캐시 관리, 버스 중재 등의 역할) 메커니즘을 가지고 있어도 (대전 문지캠 내에서 해결해도 되는 문제인데) 그것을 운영하는 Policy가 좋지 않으면 매번 서울을 갔다와야 하는 문제가 발생할 수 있다. 생각만 해도 피곤하다.🥶
서울을 다녀오는 상황을 Thrashing이라고 한다. 고로 demand paging을 잘하는 것이 문지캠 내에서 해결하냐? 서울까지 다녀와야 하느냐?의 문제로 귀결된다고 보면 된다.
virtual address space는 실제 컴퓨터가 작은 물리 메모리를 가지고 있어서 자기보다 훨 큰 user program을 받아들일 수 있다. 존재하지 않은 물리 메모리를 표현하지만, 완전히 없는 것을 제공할 수 없으니 물리 메모리의 부족한 부분은 swap device에 보내 채우는 것이다.
고로 우리의 바람은 virtual address가 physical address로 변환이 될 때, swap device보다 RAM에 들어가는 것. 즉, swap device를 access해야 되는 횟수를 가장 최대한 줄이는 것이다.
이상적인 방법은 앞으로 사용될 페이지와 사용되지 않을 페이지를 미리 알아서 물리 메모리로 불러들이거나 swap device로 내보내는 것이다.
고려해볼 점은
1. 어떤 페이지를 언제 물리 메모리로 올릴까 (Page Selection Policy)
2. 물리 메모리에 frame이 부족해 누굴 제거하고(victim) swap device에 보낼지 (Page replacement Policy)
프로세스들이 사용하는 Page들의 크기보다 사용 가능한 물리 메모리의 크기가 작을 때, 사용하기 위해 Swap-in 하는 Page에 의해 앞으로 사용할 Page가 Swap-out되면서 반복적으로 page fault가 일어나는 현상을 말한다.
Virtual Address reference하려 하는데 타켓 페이지가 resident하지 않아(메모리에 올라와 있지 않아) 더 이상 수행할 수 없을 때 page fault라고 하는 S/W interrupt를 발생시킨다.
이제 page fault handler가 발생하면 그 fault를 만든 프로세스의 수행은 중단 시키게 된다. 그리고 중단한 애의 context를 전부 저장하며 block상태로 가게 된다.
page fault handler는 DMA controller에게 해당 페이지의 주소를 던져주고 DMA를 시작한다. swap device에서 physical memory 싸악- 페이지를 읽어들일 것이다.
DMA controller 관련 그림은 이전에 포스팅했던 hello 프로그램을 실행할 때 무슨 일이 일어나요? 에서 볼 수 있다.
참고자료 Pintos_lab3_slide
오랜만에 아침 운동을 했더니 잠이 다 깨고 너무 개운해서 하루 컨디션이 좋았다.🏋🏻♀️
정글에서 제공해준 공식문서 깃북과 권영진 교수님의 카이스트 ppt, pintos 코드에 적혀있는 todolist를 해석해보고 진행할 수 있도록 같은 속도로 함께 해주는 팀원들에게 고맙다.
덕분에 개념많이 배우고 갑니다.