728x90
Swap Disk
Swap Disk는 운영체제가 메모리가 부족할 때, 일시적으로 데이터를 저장하는 디스크 영역입니다.
필요성
운영체제는 가상 메모리 때문에 실제 물리 메모리보다 더 큰 메모리 공간을 지원할 수 있습니다. 그런데 실제로 RAM이 부족하다면 사용하지 않는 페이지를 디스크로 내보내야합니다. 그러고 나중에 다시 필요할 때 swap-in 하면 됩니다.
→ swap은 더 많은 프로세스가 동시에 실행, 프로그램 실행 중 힙 / 스택 확장을 허용합니다. 또한 메모리 사용량의 유연한 조절이 가능하게 합니다.
흐름도
- 페이지 교체 (eviction) 대상이 선택됩니다.
- 해당 페이지가 익명 페이지고, 파일 백업이 없다면
- 페이지의 내용을 swap 공간에 저장합니다. (→
swap_out()
) - 페이지 테이블에서 해당 페이지는 매핑을 제거합니다.
- 나중에 다시 접근하면 페이지 폴트가 발생하고, 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와 다를 수 있음)
swap_out(page);
에서 메모리에 있는 페이지 내용을 8개 디스크 섹터로 분할 저장합니다.bitmap_scan_and_flip()
으로 빈 swap 슬롯을 찾아 기록합니다.page->anon.swap_slot
에 해당 슬롯 번호 저장합니다.swap_in(page, kva);
을 통해page->anon.swap_slot
에 기록된 섹터에서 내용을 읽어 옵니다.- 물리 프레임 (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 |