【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.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...
随机推荐
- L2-3 智能护理中心统计
题目描述: 智能护理中心系统将辖下的护理点分属若干个大区,例如华东区.华北区等:每个大区又分若干个省来进行管理:省又分市,等等.我们将所有这些有管理或护理功能的单位称为"管理结点" ...
- 使用openlayers扩展插件ol-ext设置地图指定区域高亮
最近要实现一个从底图向上发光的功能,着实纠结了好久,起初像是使用polygon 颜色透明度来实现,但毕竟底图不亮,增加图层效果不理想呀 一.ui设计是这样 二.绘制面 为底图增加一个MultiPoly ...
- 自然语言处理(NLP) - 前预训练时代的自监督学习
前预训练时代的自监督学习自回归.自编码预训练的前世 神经网络(Neural Network, NN) 损失函数,度量神经网络的预测结果和真实结果相差多少 平方差损失(欧式距离角度)预测概率分部和实际标 ...
- Quartz + SpringBoot 实现定时任务(多任务,多执行时间)代码模板(直接CV即可)
一,什么是Quartz quartz 是一款开源且丰富特性的Java 任务调度库,用于实现任务调度和定时任务.它支持各种任务类型和灵活的配置选项,具备作业持久化.集群和分布式调度.错误处理和重试机制等 ...
- Rust中的变量的声明和定义
变量的声明和定义 Rust中合法的标识符(包括变量名.函数名.triat名等)必须由数字.字母.下划线组成,而且不能以数字开头.这个和很多语言都是一样的.Rust将来也会允许其他Unicode字符作为 ...
- 设计 C++ 接口文件的小技巧之 PIMPL
设计 C++ 接口文件的小技巧之 PIMPL C++ 里面有一些惯用法(idioms),如 RAII,PIMPL,copy-swap.CRTP.SFINAE 等.今天要说的是 PIMPL,即 Poin ...
- 逍遥自在学C语言 | 指针和数组的关联
前言 指针和数组之间存在着紧密的关系.在本文中,我们将探讨指针和数组的关系.指针算术和数组遍历.多维数组与指针以及指针数组和数组指针. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 ...
- 行行AI人才直播第5期:系列课-AI理解及ChatGPT从基础到高级应用
当前,人工智能是全世界研究的重点对象,也是人们茶余饭后讨论的经典话题.自从 OpenAI 发布 ChatGPT-4 之后,似乎无论是在工作.娱乐.甚至是日常生活中,我们都能感受到AI带来的便利和改变. ...
- 基于GPT搭建私有知识库聊天机器人(五)函数调用
文章链接: 基于GPT搭建私有知识库聊天机器人(一)实现原理 基于GPT搭建私有知识库聊天机器人(二)环境安装 基于GPT搭建私有知识库聊天机器人(三)向量数据训练 基于GPT搭建私有知识库聊天机器人 ...
- 从0开发WebGPU渲染引擎:实现路径追踪
大家好,本文基于WebGPU的计算着色器实现了基础的路径追踪器,支持Middle BVH和No BVH两种加速结构 我主要是将离线渲染零基础实战开发培训班(一期)->第二十九节课的代码移植到We ...