you will implement the non-disk based image called anonymous page.
이번 과제는 사실 Demand Page (= Lazy Load) 구현이 핵심이라고 생각한다. 그때 페이지 타입 간의 차이 (UNINIT, ANON, (Project 3-3 예정)FILE) 을 구분하는건 덤이고. 가상 주소 단위인 Page는 다음과 같은 생애 주기를 갖고, 이번 과제에서는 Lazy Load, 그리고 VM_ANON 한해서 swap in을 잠깐 맛보았다.
Demand Page
사전 지식 (코드편)
기능 흐름도
- 프로그램 실행 시, 이전 Project와 달리 프로그램 전체를 즉시 로드하지 않고, 지연한다.
- 이때 Page 단위로 쪼개어 Load 시점에 필요한 파일 정보들을 함께 담아 UNINIT 타입으로 페이지 생성
[여기서 질문] 실행 파일임에도 Load 후 왜 VM_FILE이 아닌 VM_ANON 타입으로 할당할까?
더보기
실행 파일 안에는 .text 영역만 있어 무조건 read-only 이지 않을까 했는데, 컴파일 시점에 LOAD Segment 별로 (그 안에는 .text, .data, .bss 영역 등이 포함해서) 가상 주소가 결정되고 가변 영역이 존재할 수 있겠네요.
VM_FILE : 부모-자식 프로세스가 동일한 파일(페이지)를 참조하고, 프로그램 실행 중 .data 영역 등을 변경하고 충돌 위험 VM_ANON : 각 프로세스는 독립적인 페이지를 갖고, 서로 영향 없이 진행
"Copy-on-write"라는 기법인데, 부모나 자식 중 누군가가 실제로 write할 때까지 복사를 안하고 미룬다는 기법입니다. 실제로도 성능 향상에 크게 도움되고, 많이 사용되는 기법입니다.
- 그리고 Load 시점에 page_initializer && init 함수가 불린다.
- (Project 4-4 맛보기) page 첫 참조 시 page fault 발생 및 swap_in 함수가 호출된다. 이때 등록해둔 operator가 작동함
- 유저 스택의 경우 argument_parsing 에 바로 필요하기에 지연 없이 그리고 출처가 없기에 VM_ANON 타입으로 바로 페이지가 할당된다. 그리고 frame과 맵핑된다.
Page Fault
- UNINT page가 최초로 참조되면, Page Fault가 발생한다.
- 이때 인터럽트 핸들러 함수로 interrupt vetor 14번에 등록한 page_fault 가 호출된다.
- va가 속한 page를 찾은 뒤, frame을 할당하고 맵핑한다. 그리고 swap_in 이 호출되어 연기한 파일 로드 작업을 수행
- 인터럽트 처리 후, iretq 로 예외가 발생한 주소부터 재시작한다.
'2️⃣ 개발 지식 B+ > OS' 카테고리의 다른 글
[PintOS 3-5] Swap In/Out (0) | 2024.10.21 |
---|---|
[OS] File System 강의 정리 - 반효경 교수님 (v2017) (2) | 2024.10.19 |
[PintOS 3-1] Memory Management (0) | 2024.10.14 |
[OS] PML4 이해하기 (w. PintOS) (1) | 2024.10.14 |
[OS] Virtual Memory 역할, 주소 변환 (0) | 2024.10.14 |