a 等)封装在 SQE 中。
SQ 和 CQ 都是无锁的单一生产者-单一消费者环形缓冲区(ring buffer),这意味着在常规使用场景下,用户空间和内核之间不需要任何系统调用即可完成 I/O 提交和收割。
2.2 两种工作模式
io_uring 提供两种工作模式以适应不同的性能需求:
- Interrupt-Driven 模式(默认):内核在完成 I/O 后将 CQE 写入 CQ,用户空间通过
io_uring_wait_cqe()或轮询方式获取完成事件。适合大多数应用场景。 - Polling 模式(IORING_SETUP_SQPOLL):内核启动一个专用线程(sqthread),不断轮询 SQ 中的新 SQE 并自动提交,全程零系统调用。适合极致低延迟场景(NVMe、XDP)。需要 root 或
CAP_SYS_ADMIN权限。
2.3 缓冲区选择:Fixed Buffers & Files
io_uring 支持两种高级优化特性:
- Fixed Buffers(IORING_REGISTER_BUFFERS):预先注册一组固定缓冲区,内核在首次使用时建立 page pin 和 page table 映射,之后的每次 I/O 无需再 pin/unpin 内存。这在高 IOPS 场景下可减少 20%-30% 的延迟开销。
- Fixed Files(IORING_REGISTER_FILES):预先注册文件描述符表,io_uring 内部使用 array index 替代 raw fd,避免每次 I/O 的 file lookup 开销,并避免 fget/fput 的 RCU 开销。
三、io_uring API 实战编程
3.1 队列初始化和销毁

发表评论 取消回复