【io_uring】简介和使用
简介
io_uring 是 Linux 在 5.1 版本引入的一套新的异步 IO 实现。相比 Linux 在 2.6 版本引入的 AIO,io_uring 性能强很多,接近 SPDK[1],同时支持 buffer IO
io_uring 的作者 Jens Axboe 是 Linux 内核块层和其他块设备的维护者,同时也是 CFQ、Noop、Deadline 调度器、blktrace 以及 FIO 的作者,对内核块层非常熟悉
使用
系统调用
io_uring 只增加了三个 Linux 系统调用分别是 io_uring_setup,io_uring_enter 和 io_uring_register
他们的入口都在 Linux 内核源码的 fs/io_uring.c 文件中
用户程序可以直接利用 syscall(__NR_xxx, ……) 的方式直接调用,使用起来很麻烦
liburing
由于直接使用系统调用较为复杂,Jens Axboe 还提供了封装好的用户态库 liburing,简化了 io_uring 的使用,代码位置在 github 上
样例
liburing 仓库的 examples/ 目录下提供了几个简单的样例程序:
| 文件 | 功能 | 其他 |
|---|---|---|
io_uring-test.c |
读取一个文件的全部内容 | - |
io_uring-cp.c |
复制一个文件的内容到另一个文件 | 利用 user_data 手动处理读写 IO 之间的依赖,读 IO 返回之后才下发写 IO |
link-cp.c |
复制一个文件的内容到另一个文件 | 同时下发读写,利用 IOSQE_IO_LINK 保证读写之间的依赖[2] |
ucontext-cp.c |
复制 n 个文件的内容到另 n 个文件 | 利用 ucontext 进行上下文切换,模拟协程 |
代码流程
仔细阅读前三个用例,可以看出利用 io_uring 的一般流程如下:
- 利用
open、fstat等函数来打开文件以及元数据查看等操作- 因为 io_uring 替换的是读写接口,后续 io_uring 操作的对象是
fd(由open函数执行返回的)
- 因为 io_uring 替换的是读写接口,后续 io_uring 操作的对象是
- 利用
io_uring_queue_init初始化struct io_uring ring结构体 - 初始化
struct iovec *iovecs结构体用于存放用户态 buffer 指针和长度 - 通过
io_uring_get_sqe获取sqe - 通过
io_uring_prep_#OP对sqe填充命令,buffer 以及 offset 信息- 【可选】 通过
io_uring_sqe_set_data对sqe附加user_data信息(该信息会在cqe中进行返回)
- 【可选】 通过
- 通过
io_uring_submit对整个ring的所有sqe进行下发 - 通过
io_uring_wait_cqe或者io_uring_peek_cqe来获取cqeio_uring_wait_cqe会阻塞当前线程直到有一个cqe返回io_uring_peek_cqe不会阻塞,如果当前没有cqe,就会返回错误io_uring_cqe_get_data可以从cqe中获取user_data
- 通过
io_uring_cqe_seen对当前cqe进行清除,避免被二次处理 - 所有 IO 完成后,通过
io_uring_queue_exit将ring销毁
编译
根据官方 Makefile 可以看出编译时有额外的三个条件
- 定义
_GNU_SOURCE宏,-D宏定义 - 指定额外的头文件目录,
-I指定头文件目录位置 - 使用
liburing库,-L指定库位置,-l指定库名
即 gcc -D_GNU_SOURCE -I../src/include/ -L../src/ -luring -o test test.c
其中头文件目录下主要有三个头文件:
$ tree src/include/
src/include/
├── liburing
│ ├── barrier.h
│ └── io_uring.h
└── liburing.h
1 directory, 3 files
而 liburing 库也需要编译生成,推荐直接在 liburing 的顶层目录直接 make all
参考资料
本文作者: ywang_wnlo
本文链接: https://ywang-wnlo.github.io/posts/c142853f.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
【io_uring】简介和使用的更多相关文章
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- Cassandra简介
在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- Microservice架构模式简介
在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- HTTPS简介
一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- Cesium简介以及离线部署运行
Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...
- 1.Hibernate简介
1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发; b.大大减少代码量; c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...
随机推荐
- c++的前世今生
C++ 语言是本贾尼·斯特劳斯特卢普 在1982 年发明的,早期版本被称为C with Classes,之后在1983年更名为C++. C++语言在发明后很快就获得了广泛的应用,由于其具有高效.灵活和 ...
- .cur 图片加载提示 You may need an appropriate loader to handle this file type
最近一个gis 项目需要加载一个.cur的图标,但是编译时提示 You may need an appropriate loader to handle this file type, current ...
- 10 款 VS Code 插件神器,第 7 款超级实用!
VS Code 是这两年非常热门的一款 IDE,它不仅有提升开发体验的界面.轻量化的编辑器,还有丰富而强大的插件,这些优秀的插件使得 VS Code 生态体系更加吸引人,让开发效率大大提升.本文来介绍 ...
- 六大云端 Jupyter Notebook 平台测评
有许多方法可以与其他人共享静态 Jupyter 笔记本,例如把它发布在 GitHub 上或通过 nbviewer 链接进行分享. 但是,如果接收人已经安装了 Jupyter Notebook 环境,那 ...
- 使用Mybatis-Plus问题解答
我们使用一个新的框架难免会遇到各种问题,当然使用这款国产的优秀的Mybatis-Plus框架也不例外,下面我就给大家列举一下使用Mybatis-Plus可能遇到的一些问题,并做一下一一的解答. 1:如 ...
- 自研ORM 完美支持 Exists查询 非常灵活
示例代码 Case 1 Code var data = db.Query<Product>() .Where(w => db.Query<Product>().Where ...
- 01-面试必会-JAVA基础篇
1. Final 有什么用? 展开查看 被 final 修饰的类不可以被继承 被 final 修饰的方法不可以被重写 被 final 修饰的变量不可以被改变, 被 final 修饰不可变的是变量的引用 ...
- Self-Instruct 论文解读:利用大模型自己给自己生成指令数据,指令数据自动生成
总览 大规模"指令调整"的语言模型,即指令微调的LLM,已经表现出非凡的零样本能力,尤其是推广新任务上. 然而,这些模型严重依赖于人类编写的指令数据,而这些数据通常在数量.多样性和 ...
- Github-Readme-Stats 简明教程
1. 更新 Readme 文件 在你想要放置 Readme-WakaTime 的位置中放置以下注释,这将作为程序的入口 <!--START_SECTION:waka--> <!--E ...
- Sentieon | 每周文献-Population Sequencing-第一期
群体基因组系列文章-1 标题(英文):The Impact of ACEs on BMI: An Investigation of the Genotype-Environment Effects o ...