linux 异步IO AIO

本文介绍了Linux系统中的异步I/O(AIO)使用,特别是libaio库。AIO用于避免文件系统缓存,提高性能,尤其在数据库和SSD场景。文中讲解了io_setup、io_submit、io_getevents等关键接口,强调了使用AIO时文件必须以O_DIRECT打开,以及对齐、fsync不支持等问题。同时,还提到AIO在特定场景(如socket、pipe)的限制,并建议结合eventfd和epoll使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

某些应用不希望使用文件系统的缓存,而直接发起io请求,就会使用O_DIRECT选项。比如数据库等应用自身有缓存,不期望下层再做一次缓存。再比如使用SSD性能时,由于内核对于pdflush的控制可能会导致SSD的性能不稳定,一般也使用dio进行。
此时为了高效的使用操作系统资源以及获得更高的性能往往使用异步IO。
理论上异步IO单线程的IO栈的深度可以同等于同步IO的多线程的线程数目,以达到相同的性能。

在linux上,使用的aio的库主要有glibc实现的和linux本身提供的。
glibc相当于在用户态通过使用多线程来模拟异步IO,实际还是使用同步IO进行读写,并且有一些bug,不推荐使用。

另外一种是linux 本身提供的aio系统调用,libaio进行了简单封装,使得系统调用更方便使用。编译时需要加上-laio。

下面总结下libaio的使用:

1 接口说明
#include <libaio.h>
       这里介绍下主要的几个函数
       
       int io_setup(unsigned nr_events, aio_context_t *ctxp); 创建一个最大支持nr_events个数的aio_contex, 也就是说这个aio_contex上同时最多有nr_events个io请求(提交的请求完成后,可以补出新的请求),相当于IO队列深度。每个aio_contex都会对应内核上的数据结构,上会有队列等,有一定的开销。
       int io_submit(aio_context_t ctx_id, long nr, struct iocb **iocbpp);提交nr个io请求,io请求以数组的形式保存在iocbpp中。 iocbpp中的数据等到io_submit调用返回后就可以销毁。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值