본문 바로가기

CS(ComputerScience)/Pintos

Pintos, MM & Anon Page (feat. Page Fault Handling)

728x90

 

Pintos, MM & Anon Page (feat. Page Fault Handling)

 

Pintos Project3 Virtual Memory

궁극적인 목표는 프로세스가 물리적 용량 이상으로 메모리에 엑세스 할 수 있도록 하는 것!
즉, 부족한 RAM용량을 보완하는데 Virtual Memory가 쓰인다.
그러기 위해서는 보조적인 Page Table, Page Fault Handling 등을 구현해야 한다.
 
이번 주차는 Memory Management와 Anonymous Page 챕터에서 Page Fault Handling를 구현해봤다.


Memory Management

프로세스(Pages) > 할당받은 메모리(RAM)

 

RAM은 한정적인 용량을 가지고 있으므로 전체 프로그램을 메모리에 가져오는 대신 적당한 크기(Page)로 잘라서 사용한다. 
운영체제는 가동되고 있는 내용(Page) 중 덜 중요한 것들은 하드 디스크나 SSD같은 보조 기억장치에 옮겨 놓는다. 그리고 프로세스가 동작하는 도중 메모리에 필요한 데이터가 없으면 보조기억장치에서 해당 데이터를 가져온다.
 

프로세스 : 생선 🐟
페이지 : 생선 토막 🔪
RAM : 도마
HDD or SSD : 냉장고

 
당장 요리해 먹을 생선 토막은 도마에 올려놔 요리한다.
남은 생선토막들은 나중에 먹기 위해 냉장고에 넣어둔다.
이와 같은 원리로 메모리를 관리한다고 생각하면 이해가 쉽다.
 
그리고 이 과정을 Swapper가 수행한다.

Virtual Memory ---- Swap In ---> Main Memory
Virtual Memory <---- Swap Out --- Main Memory

냉장고에 넣어둘 때, 어떤 생선의 어느 토막인지 기록한 뒤 넣어준다.


📌 Page Fault

운영체제의 Swapper는 물리 메모리에 동작하고 있는 모든 프로세스를 로드하지 않는다.
또한, Pager는 프로세스의 모든 페이지를 물리 메모리에 로드하지 않는다.
그러므로 페이지가 물리 메모리에 없을 수 있는데, 이를 Page Fault라고 한다.
 

📌 Page Fault Handling

Page Fault가 발생하면 그곳에 어떤 데이터가 있어야 하는지 kva(Kernel Virtual Address)를 탐색해 파일 또는 swap slot에서 해당 페이지를 가져와야 한다. 또한 프로세스 종료 시, 어떤 자원을 해제해야 하는지 탐색해야 한다.
이 과정을 도와주는 테이블이 필요!
 
Pintos 과제에서는 이 과정을 Supplemantal Page Table을 사용해 Page Fault Handling을 처리했습니다.
 
 

📌 SPT 와 Lazy Loading, Depanding Page

SPT [출처 : 정글 Pintos project3]

SPT : 페이지에 대한 메타 데이터를 저장하는 데이터 구조(Hash Table로 구현)
Lazy Loading : 필요에 따라 페이지를 loading하여 메모리 사용량을 최적화하는 기술
Demanding Page : 페이지 오류를 처리하고 정보를 탐색해 페이지를 메모리로 가져오는 메커니즘

이러한 개념이 조화롭게 작동해 Page Fault가 발생했을 때, 필요한 정보를 얻기 위해 SPT를 탐색, RAM에 Lazy Load해 줍니다.
 

📌 기존 방식과의 차이점

  기존 수정 후
방식 Eager Loading Lazy Loading
역할 파일을 Segment Page 단위로 메모리에 Load 가상 주소 공간에 Page 단위로 메모리에 Load & Mapping
Loaded Data in RAM 모든 Data & Resource 필수 Data & Resource
페이지 매핑 페이지를 프로세스의 주소공간에 직접 매핑 가상주소와 물리주소를 1:1 매핑하고 페이지를 프로세스 주소 공간에 추가
주소 공간 확장 주소 공간의 크기가 파일 크기가 작을 경우, fail처리(Page Fault 발생시 에러 & free) 주소 공간의 크기가 파일 크기보다 작을 경우, 추가 페이지를 할당해 주소 공간 확장

 
 
 
 


📌 Anonymous Page

Page Fault가 발생해 Page를 특정 리소스에 매핑하기 전, Page를 초기화 해줘야 합니다.
 

📌 Git Book

A page can have a life cycle of initialize->(page_fault->lazy-load->swap-in>swap-out->...)->destroy.

 

📌 Zero the Page(init)

페이지 생성 또는 초기화 단계에서 페이지의 모든 내용은 0으로 설정해야 합니다.
이 작업을 해주는 이유는 보안 및 정확성 때문입니다.
만약 매핑 과정에서 다른 프로세 메모리를 본다면, 다른 machine에서 사용했던 메모리를 볼 수 있습니다.
그렇기 때문에 매핑 전, 데이터 유출 위험이나 의도하지 않은 엑세스를 줄이기 위해 0으로 설정해 줍니다.
 

📄 vm/anon.c

/* Initialize the file mapping */
bool
anon_initializer (struct page *page, enum vm_type type, void *kva) {
	/* Set up the handler */
	page->operations = &anon_ops;
	memset (kva, 0, PGSIZE);

	return true;
}

'CS(ComputerScience) > Pintos' 카테고리의 다른 글

Pintos Project, VScode Debugging Setting  (0) 2023.05.17
Pintos Project2. User Program  (0) 2023.05.09
Pintos, Priority Scheduling and Synchronization  (2) 2023.04.27
Pintos Alam Clock  (0) 2023.04.24