Open gh-liu opened 4 months ago
最开始是同步(阻塞式)系统调用 随着实际需求和具体场景,不断加入新的异步接口,还要保持与老接口的兼容和协同工作(在非阻塞式读写的问题上并没有形成统一方案) 到 io_uring 的出现
O_DIRECT
Linux内核(5.1)提供的新异步I/O框架
原生 Linux AIO 框架存在各种限制,io_uring 旨在克服这些限制:
io_uring实例有两个环:提交任务队列SQ和完成任务队列CQ,被内核和用户程序共享; 这两个队列都是单生产者、单消费者,大小为2的幂;
提交任务队列SQ
完成任务队列CQ
提交任务项SQE
完成任务项CQE
io_uring_setup io_uring_register io_uring_enter
// 设置好`提交队列`和`完成队列`,至少`entries`个项 // 返回的 fd 用于执行后续操作 // 通过`io_uring_params`可以配置三种模式:Interrupt driven, Polled, Kernel polled // // setup a context for performing asynchronous I/O int io_uring_setup(u32 entries, struct io_uring_params *p); // 注册文件或用户缓冲区允许: // 1. 内核长期引用与文件关联的内部内核数据结构, // 2. 内核创建与缓冲区关联的应用程序内存的长期映射, // 仅在注册期间而不是在处理每个 I/O 期间进行一次请求,从而减少每个 I/O 开销。 // 根据不同的 opcode 决定不同的 arg // // register files or user buffers for asynchronous I/O int io_uring_register(unsigned int fd, unsigned int opcode, void *arg, unsigned int nr_args); // 使用共享的SQ和CQ(由io_uring_setup创建)进行初始化或完成I/O操作 // 单次调用`io_uring_enter`可以同时:1. 提交新的I/O操作 2. 等待上一次调用`io_uring_enter`提交的I/O完成 // // initiate and/or complete asynchronous I/O int io_uring_enter(unsigned int fd, unsigned int to_submit, unsigned int min_complete, unsigned int flags, sigset_t *sig);
Linux I/O 的演进
O_DIRECT
flag,零拷贝I/Oio_uring
原生 Linux AIO 框架存在各种限制,io_uring 旨在克服这些限制:
提交任务项SQE
,更新提交任务队列SQ
队尾;提交任务项SQE
,更新提交任务队列SQ
队头;完成任务项CQE
,更新完成任务队列CQ
队尾;完成任务项CQE
,更新完成任务队列CQ
队头;API
io_uring_setup io_uring_register io_uring_enter