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 队列初始化和销毁

                        

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部
0.460749s