✍️ [PintOS] anon.c 기반 스왑 및 익명 페이지 동작 퀴즈 정리
PintOS의 익명 페이지(anonymous page) 처리 로직을 담당하는 anon.c는
swap-in / swap-out / destroy의 핵심 구현을 포함하고 있다.
이 파일을 기반으로 퀴즈 형식으로 동작 원리를 복습하며,
스왑 슬롯 관리와 공유 프레임 처리 구조를 확실히 이해해보려고 노력해보았다.

✅ Q1. read == 0 조건의 목적
풀이 요약
anon_swap_in()에서는 pml4 매핑은 여러 번 수행하지만,
실제 디스크 복구는 딱 한 번만 해야 한다.
read++ == 0 조건으로 첫 번째 루프에서만 disk_read()를 수행함
- 그렇지 않으면 같은 데이터를 여러 번 read/write 하게 되어 비효율과 오류가 발생할 수 있음
포인트
- 디스크 접근은 1회, pml4 설정은 N회라는 구조
✅ Q2. anon_swap_out()의 저장 순서
풀이 요약
- 빈 swap 슬롯을 하나 할당해서 page에 연결
- frame에 연결된 page들을 하나씩 꺼내면서:
- cnt_page 감소
- 슬롯의 page_list에 추가
- 해당 페이지 내용을
disk_write()로 저장
- 마지막에
pml4_clear_page()로 매핑 제거
- 리스트가 빌 때까지 반복 후 true 반환
포인트
- 디스크 저장은
va + offset으로 sector 단위
- 매핑 해제 시점은 저장 이후
✅ Q3. anon_destroy()가 디스크 정리를 안 하는 이유
풀이 요약
- 페이지를 참조하는 다른 객체가 여전히 같은 frame을 쓰고 있을 수 있음
- 그 상태에서 스왑 슬롯이나 frame을 해제하면 예기치 않은 오류 발생
- 그래서
cnt_page--만 수행하고, 나머지는 보류
포인트
- 리소스는 참조 수 기반으로 해제해야 함 (shared resource 관리 패턴)
✅ Q4. vm_anon_init()에서 수행하지 않는 작업
정답
설명
- vm_anon_init은 swap 디스크, 슬롯 리스트, 락, zero buffer만 준비
- 페이지 테이블 초기화는
supplemental_page_table_init()에서 함
✅ Q5. anon_initializer()가 수행하지 않는 작업
정답
설명
- slot 연결은 swap-out 시점에 수행됨
- initializer 단계에서는 아직 디스크 관련 정보 없음 → slot == NULL
포인트
- anon_initializer는 pml4 설정, operations 설정까지만 처리함
✅ Q6. 스왑 슬롯의 재사용 시점
풀이 요약
- anon_swap_in()이 완료된 후, 사용했던 slot을
swap_slot_list에 다시 push함
- 이로써 슬롯은 재사용 가능 상태로 전환됨
포인트
- 자원 회수 시점은 swap-in 종료 후 (모든 page 복원 이후)
✅ 마무리 요약
이번 anon.c 퀴즈를 통해 다음을 명확히 정리할 수 있었다:
- 스왑 디스크는 sector 단위로 쓰고, 페이지는 frame 단위로 관리된다
- slot은 여러 page를 묶는 단위이며, swap-in/out 흐름 내에서 정확히 회수된다
- shared frame 환경에서는 destroy, free 시점과 순서를 잘 조절해야 안전하다
- 참조 수(
cnt_page)를 통해 실제 해제 여부를 판단한다는 점은 OS 리소스 관리의 기본 철학이다
vm.c, file.c, anon.c 의 코드들로 문제를 풀어보니 더 이해가 잘 가는 느낌이다.
다만 아직 부족한 부분이 있을 수 있으니 계속 더 공부해야 할 것 같다