운영체제에서 File-backed Page란, 메모리 페이지가 파일 시스템의 특정 파일로부터 초기화되는 페이지를 의미한다. 이는 프로세스의 실행 파일, 라이브러리, 읽기 전용 데이터 등의 메모리 매핑 영역에서 사용된다.
즉, 이 페이지는 메모리에 적재되기 전 원본이 파일에 존재하며, 필요 시 디스크에서 해당 내용을 읽어 메모리에 적재한다.
| 구분 | Anonymous Page | File-backed Page |
|---|---|---|
| 원본 | 없음 (초기화 없이 생성됨) | 파일 시스템 상의 파일 |
| 재사용 | 불가능 | 동일한 파일 매핑 시 공유 가능 |
| 스왑 처리 | Swap 디스크에 저장 | 필요 시 파일로부터 다시 로드 |
| 예시 | 힙, 스택, mmap 익명 매핑 | 실행 코드, 읽기 전용 데이터 |
File-backed Page는 공유 가능, 불필요한 스왑 최소화, 효율적인 로딩이라는 장점이 있다.
File-backed Page는 보통 다음과 같은 흐름으로 동작한다:
mmap() 등을 통해 파일을 메모리에 매핑한다.이와 같은 방식은 Lazy Loading 기법과 결합되어, 실제로 접근하는 시점에만 디스크 I/O가 발생한다.
Pintos 프로젝트에서는 File-backed Page를 다음과 같이 표현한다:
struct file_page {
struct file *file; // 매핑된 파일 객체
off_t offset; // 파일 내에서의 오프셋
size_t read_bytes; // 실제 읽어야 하는 바이트 수
size_t zero_bytes; // 0으로 채워야 하는 바이트 수
bool writable; // 쓰기 가능 여부
};
이를 통해 페이지를 다시 로딩하거나, 파일에서 읽어오는 동작을 구현할 수 있다.
File-backed Page는 대부분 Lazy Loading 기반으로 작동한다. 초기에는 메모리를 할당하지 않고, 페이지에 실제 접근할 때 파일 내용을 읽어오는 구조를 따른다.
write-back을 통해 수정된 내용을 파일에 반영해야 한다.// 파일을 메모리에 매핑
void *addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
// 매핑 해제
munmap(addr, size);
Linux에서는
mmap()시스템 콜을 통해 File-backed Page를 만들 수 있으며, 이를 통해 프로세스가 파일 내용을 직접 메모리처럼 사용할 수 있게 된다.
mmap() 등을 통해 구현되며, Pintos 등의 프로젝트에서도 중요한 개념으로 등장한다.