이번 핀토스 프로젝트 3에서는 페이지 폴트를 다뤄야 하는 상황이 많았는데, 해당 Case들을 전부 다뤄보고자 한다.
크게 Fault가 발생하는 경우는 3가지가 존재한다.
- 프로세스가 요청한 가상 메모리 페이지가 물리 메모리에 적재되지 않았을 경우 발생하는 페이지 폴트
- 쓰기 권한이 없는 페이지(읽기 전용, read-only)에 write 작업을 수행할 경우
- 유효하지않은 주소에 대한 접근 요청인 경우
각각의 Case들을 살펴보도록하자
1. Demand Paging
요구 페이징에는 각각 3가지의 케이스에서 Page Fault가 발생할 수 있다.
1. LazyLoading
2. Swap Out
3. Stack Overflow
Lazy Loading
lazy loading 방식에서는 프로그램이 처음 실행될 때, 운영체제가 모든 페이지를 물리 메모리에 적재하지 않는다.
그래서 데이터에 접근(access)할 때 page_fault가 일어나게 되고, 이때 해당 페이지를 물리 메모리에 mapping하여 적재하게 된다.
Swap Out
스왑 아웃 이후에도 페이지 폴트가 발생한다.
🤔 What is Swap Out?
스왑 아웃에 대해 간략히 설명하면, 가상메모리의 한 페이지를 피지컬 메모리에 할당해달라고 요청할 때 피지컬 메모리가 가득 차서 프레임을 할당 받지 못하게 될때 스왑아웃 정책에 의해 선택된 프레임이 디스크의 스왑 영역으로 스왑 아웃됩니다.
이후 해당 프레임과 매핑되어있던 페이지에 접근 시 해당 페이지에 매핑된 프레임은 피지컬 메모리가 아닌 디스크의 스왑영역에 존재하게 되어 Page Fault가 발생.
Stack Overflow
다음으로 Stack Overflow 상황이다.
User Stack의 현재 Stack Bottom보다 아래의 주소에 페이지를 할당해달라는 요청이 들어오게 될 경우 Page Fault가 발생하게 됩니다.
이 경우 Page Fault를 캐치해서 필요한 만큼 페이지를 할당할 수 있는지 체크하고 Stack을 늘리는 작업
즉, Stack Growth를 실행하여 해당 경우를 처리한다.
stack_growth 함수
2. Writing r/o
페이지 폴트가 발생하는 또 다른 경우는, read-only 파일에 writing 작업을 하려고할 때이다.
해당 경우를 위의 코드로 처리해 놓았다.
Page Fault가 발생하면 위의 fault_handler로 흐름이 전달된다.
여기서 not_present 라는 변수는 fault address에 매핑된 프레임 물리 메모리에 없다는 것을 의미합니다.
그래서 not_present가 true인 경우에는 앞에서 설명된 Lazy Loading이나 Stack Growth로 해결되었다.
그리고 not_present 변수가 false라는 것은 frame이 할당되어 있는데 page_fault가 발생했다 라는 것으로 read-only 파일에 write를 하려고 해서 page_fault가 발생했다는 뜻이 된다.
그래서 해당 경우는 잘못된 요청으로 판단하여 false를 리턴
3. Invalid Adress Access
마지막 경우는 유효하지않은 메모리 주소에 접근할 경우에 발생하는 Page Fault.
대표적인 예시로 유저모드에서 커널 영역의 주소에 대하여 작업을 요청할때가 있다.
이러한 경우를 처리하기 위해 Mode Trap이 발생하는 Syscall 영역에 다음과 같이 비정상적인 접근일 경우 프로세스를 강제로 종료시키는 함수를 작성하였었다.
만약 해당 로직이 존재하지 않아 유효하지않은 접근이 이루어진다면 Page Fault로 흐름이 넘어가게 된다.
결과
'PintOS' 카테고리의 다른 글
[PintOS] Victim Policy - 교체 알고리즘 (0) | 2024.05.27 |
---|---|
[PintOS] Project2 - UserProgram (0) | 2024.05.14 |
[PintOS] Project1 - Monitor System Deep Dive (0) | 2024.05.03 |