러스트에서 제로 카피 페이지: 또는 내가 걱정을 멈추고 라이프타임을 사랑하게 된 방법
고성능 데이터베이스 엔진에서 zero-copy 기법은 커널과 사용자 공간 간 불필요한 데이터 복사를 제거하여 CPU 부담을 크게 줄였습니다.
특히, 리눅스의 O_DIRECT 플래그를 활용해 버퍼 풀과 디스크 간 복사를 없애고, 페이지 데이터를 직접 메모리에 고정시켜 효율성을 높였습니다.
Rust 언어의 참조와 수명(lifetime) 개념을 활용해, 버퍼 풀 내 페이지 데이터를 소유권 이전 없이 빌려 쓰는 구조를 설계했습니다.
읽기 경로에서는 PageReadGuard와 HeapPageView를 통해 페이지 바이트에 대한 빌린 뷰를 제공하며, 쓰기 경로에서는 PageWriteGuard와 HeapPageViewMut가 독점적 접근을 보장합니다.
이 과정에서 Rust의 aliasing XOR mutability 원칙을 준수하며, 읽기와 쓰기 경로를 명확히 분리해 안전성을 확보했습니다.
또한, 페이지 내 데이터를 직접 복사하지 않고 필요한 시점에 산술 연산으로 뷰를 재구성하는 방식을 통해 복사 비용을 최소화했습니다.
다만, 이러한 설계는 API 사용 편의성 측면에서 일부 제약이 있으며, 읽기와 쓰기 메서드를 별도로 구현해야 하는 단점이 존재합니다.
결과적으로, 소유권을 버퍼 풀에 집중시키고 상위 계층은 동일한 바이트에 대한 참조 뷰만 다루도록 하여 중복 데이터 이동과 관련 버그를 효과적으로 방지할 수 있었습니다.
이 설계는 고성능 데이터베이스 엔진에서 메모리 복사 비용을 줄이고 안전한 메모리 접근을 보장하는 실용적인 방법을 제시합니다.