크래프톤 정글(PintOS WEEK 9 ~ 14)

Swap Disk

devkty 2025. 6. 8. 00:58
728x90

Swap Disk

Swap Disk는 운영체제가 메모리가 부족할 때, 일시적으로 데이터를 저장하는 디스크 영역입니다.

필요성

운영체제는 가상 메모리 때문에 실제 물리 메모리보다 더 큰 메모리 공간을 지원할 수 있습니다. 그런데 실제로 RAM이 부족하다면 사용하지 않는 페이지를 디스크로 내보내야합니다. 그러고 나중에 다시 필요할 때 swap-in 하면 됩니다.
→ swap은 더 많은 프로세스가 동시에 실행, 프로그램 실행 중 힙 / 스택 확장을 허용합니다. 또한 메모리 사용량의 유연한 조절이 가능하게 합니다.

흐름도

  1. 페이지 교체 (eviction) 대상이 선택됩니다.
  2. 해당 페이지가 익명 페이지고, 파일 백업이 없다면
  3. 페이지의 내용을 swap 공간에 저장합니다. (→ swap_out())
  4. 페이지 테이블에서 해당 페이지는 매핑을 제거합니다.
  5. 나중에 다시 접근하면 페이지 폴트가 발생하고, swap 공간에서 다시 읽어옵니다. (swap_in())

Pintos에서…

Pintos에서는 디스크의 일부 섹터를 swap 공간으로 활용합니다.

주요 파일인 vm / file.c 에서 구현되며 이름은 자료 구조는 다음과 같습니다.

이름 설명
block_device 실제 디스크를 추상화한 구조 (devices/block.c)
swap_bitmap 어떤 swap 슬롯이 사용 중인지 추적
PAGE_SIZE / DISK_SECTOR_SIZE 한 페이지 = 여러 개의 디스크 섹터에 매핑됨 (보통 8개)

핵심 함수는 file_backed_swap_in 와 같은 함수명으로 구현되고, 저희는 이 함수에 swap을 구현하면 됩니다.

동작 예시 (pintos와 다를 수 있음)

  1. swap_out(page); 에서 메모리에 있는 페이지 내용을 8개 디스크 섹터로 분할 저장합니다.
  2. bitmap_scan_and_flip()으로 빈 swap 슬롯을 찾아 기록합니다.
  3. page->anon.swap_slot에 해당 슬롯 번호 저장합니다.
  4. swap_in(page, kva); 을 통해 page->anon.swap_slot에 기록된 섹터에서 내용을 읽어 옵니다.
  5. 물리 프레임 (kva)에 복원합니다.

구현 시 주의사항들

  • 단위 계산: 한 페이지는 여러 섹터입니다. (4096 바이트 / 512 바이트 = 8바이트)
  • 동기화: bitmap 접근 시 race condition 방지용 락이 필요합니다.
  • 복구: swap-in 이후 swap_slot은 반드시 비워야 합니다.
  • 파일 기반 페이지는 swap 금지: 파일에서 다시 읽으면 되므로 swap 저장할 필요가 없습니다.

요약

항목 설명
Swap Disk란? RAM이 부족할 때 페이지를 임시로 저장하는 디스크 영역
필요 이유 메모리 초과 상황 대응, 다중 프로세스 실행 지원
Pintos 구조 디스크 블록을 swap 공간으로 사용, bitmap으로 슬롯 관리
핵심 함수 swap_in(), swap_out(), swap_init()
사용 대상 Anonymous Page, file-backed는 해당 없음
728x90

'크래프톤 정글(PintOS WEEK 9 ~ 14)' 카테고리의 다른 글

Direct Memory Access (DMA)  (2) 2025.06.08
File-backed Page  (0) 2025.06.08
Anonymous Page (익명 페이지)  (0) 2025.06.08
Lazy Loading(지연 로딩)  (0) 2025.06.08
Page Fault (페이지 폴트)  (0) 2025.06.08