魔法缓冲区与io_uring注册缓冲区
摘要
本文探讨了如何使用mmap创建魔法环形缓冲区,其中两个连续的虚拟内存区域映射同一物理内存,并测试其与io_uring注册缓冲区的兼容性,发现其按预期工作。
暂无内容
查看缓存全文
缓存时间: 2026/06/18 05:47
# 魔法缓冲区与 io_uring 注册缓冲区 – 还需一番组装
来源:https://www.mindfruit.co.uk/posts/2025/10/magic-buffers-and-io-uring-write-fixed/
有一个非常酷的小 `mmap` 技巧,它能把同一块底层内存区域映射到两个连续的虚拟内存地址范围。当你写入第一个映射区域末尾之外的内容时,剩余的字节会落入第二个映射区域(*同时也*落进第一个映射区域的开头)。Fabien Giesen 称其为“魔法环形缓冲区 (https://fgiesen.wordpress.com/2012/07/21/the-magic-ring-buffer/)”,我觉得这个命名挺贴切的。
我想知道,这种虚拟内存的曲折操作能否经受住 IO Uring 注册缓冲区的考验。结果(剧透警告)是可行的,而且整个链条全是虚拟内存。
我写了一个小测试程序,并把它发布到了我的 Github 上,里面还有更多注释,请见此处 (https://github.com/michael-g/mgkdb/tree/master/iou)。
本质上,这个程序做了以下几件事:
1. 构造一个魔法缓冲区(使用我的 `MgCircularBuffer` 实现,代码在此 (https://github.com/michael-g/mgkdb/blob/master/io/src/MgCircularBuffer.cpp) ——我知道,它实际上不是环形的)
2. 用 `io_uring_register_buffers` 将缓冲区的“双重区域”注册到内核
3. 跨越魔法缓冲区中的“接缝”写入一条 kdb IPC 消息
4. 用 `io_uring_prep_write_fixed` 将消息发送给几个已连接的 KDB 实例
结果如预期般工作。
相似文章
探索使用 io_uring 的自动缓冲区管理
本文详细介绍了在 UringMachine(一个用于异步 I/O 的 Ruby gem)中使用 io_uring 的缓冲区环实现自动缓冲区管理。它解释了缓冲区环如何通过允许内核使用应用程序提供的缓冲区来实现高效的多重读取/接收操作。
过早优化有时也挺有趣
一篇探讨为存储ping时间戳优化环形缓冲区数据结构的博客文章,讨论了标签联合、位域和结构体填充以减少内存占用。
内存安全最棘手的问题
本文讨论了一个基本的内存安全挑战,涉及带标签的联合体,其中指向一个变体的指针在联合体被覆盖为另一个变体后被使用,导致类型混淆。作者还认为,缓冲区溢出是最容易被利用的内存错误,如果采用更好的数组语法本可以缓解。
PostgreSQL 19 中的内核异步读取(io_uring)
PostgreSQL 19 通过 io_uring 引入了内核异步读取功能,实现了直接的异步缓冲 I/O,从而在不使用专用工作进程的情况下提高性能。
@bellicosiX:这篇读起来真是令人愉悦。写得充满爱意。我很感激。@abhi9u
一篇全面、详尽的博客文章(堪比书籍),涵盖 Linux 中的虚拟内存概念,包括页表、TLB、按需分页、写时复制、内存映射 I/O 以及性能影响,通过进程与内核之间的对话呈现。