[PintOS] Project 3 : VM - anon.c 코드 복기

CorinBeom·2025년 6월 9일

PintOS

목록 보기
19/19
post-thumbnail

✍️ [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()에서 수행하지 않는 작업

정답

  • B. 페이지 테이블 초기화

설명

  • vm_anon_init은 swap 디스크, 슬롯 리스트, 락, zero buffer만 준비
  • 페이지 테이블 초기화는 supplemental_page_table_init()에서 함

✅ Q5. anon_initializer()가 수행하지 않는 작업

정답

  • A. page에 swap slot 연결

설명

  • 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 의 코드들로 문제를 풀어보니 더 이해가 잘 가는 느낌이다.
다만 아직 부족한 부분이 있을 수 있으니 계속 더 공부해야 할 것 같다

profile
Before Sunrise

0개의 댓글