매직 버퍼와 io_uring 등록 버퍼 – 약간의 조립이 필요함

ko생성일: 2026. 6. 19.

같은 메모리 영역을 연속된 두 가상 주소 범위에 매핑하는 매직 버퍼가 io_uring의 등록 버퍼와 함께 어떻게 동작하는지 간단한 테스트로 살펴봅니다.

정말 멋진 작은 mmap 장치가 있는데, 동일한 기반 메모리 영역을 연속된 두 개의 가상 메모리 주소 범위에 매핑합니다. 첫 번째로 매핑된 영역의 끝을 넘어 써 넣으면, 남은 바이트들은 두 번째 매핑 영역에도 들어가고(그리고 첫 번째 영역의 시작 부분에도 들어갑니다). Fabien Giesen은 이것을 "Magic Ring Buffer"라고 부르는데, 저에게는 그 정도면 충분합니다.

이 가상 메모리 곡예가 IO Uring의 등록 버퍼와 맞닥뜨려도 살아남을지 궁금했습니다. 결론부터 말하면 스포일러지만, 실제로 그렇고, 아래로 내려가도 끝까지 가상 메모리입니다.

저는 작은 테스트 애플리케이션을 작성했고, 제 Github에 설명과 함께 공개했습니다.

기본적으로 이 앱이 하는 일은 다음과 같습니다:

  1. 매직 버퍼를 구성합니다(여기의 제 MgCircularBuffer 구현을 사용합니다. 알아요 … 원형은 아닙니다)
  2. io_uring_register_buffers를 사용해 버퍼의 “이중 범위”를 커널에 등록합니다
  3. 매직 버퍼의 “이음새”를 가로질러 kdb IPC 메시지를 씁니다
  4. io_uring_prep_write_fixed를 사용해 연결된 몇 개의 KDB 인스턴스로 메시지를 보냅니다

예상대로 동작합니다.