Linux实现异步IO的方法:epoll,posix aio,libaio,io_uring

Linux中异步IO的实现方式大概有以下几种:

1. epoll

熟悉网络编程的人可能会想到select,poll,epoll这些异步IO的方式,但实际上这些方式叫做非阻塞IO ,用于把网络读写的阻塞变成非阻塞,并不是实际意义上的异步IO。因此Epoll这些只能用于实现非阻塞的Socket IO无法用于异步的Storage IO

因为只有网络IO才存在阻塞的情况(也即,这个网络文件描述符是否准备好被读写?),因此你不知道网络的对方何时给你发送消息;而Storage IO则不存在这种现象,要读取的硬盘数据一直准备好被读写,因此不存在阻塞的情况。

详细的解释可以看这篇文章:https://www.pulpcode.cn/2021/04/03/regular-files-with-epoll/

关于阻塞,非阻塞,同步,异步的概念可以参考这篇文章:https://blog.csdn.net/weixin_45888152/article/details/125699347

2. POSIX AIO

首先,POSIX AIO的API在<aio.h>中,并且在编译的时候需要link librt(-lrt)。POSIX AIO 本质上在是在用户级别上实现的它在多个线程中执行正常的阻塞 I/O ,因此给人一种 I/O 是异步的错觉。这样做特点是:

▶ 它适用于任何文件系统

▶ 它(基本上)可以在任何操作系统上运行

▶ 它适用于启用缓冲的文件(即不设置 O_DIRECT 标志)

而主要缺点是IO队列深度(即实际可以执行的未完成操作数)受所选线程数的限制

3. LibAIO(kernel AIO)

libaio是在内核中实现的一套异步IO方式,它不是基于多线程实现的 ,一般也叫做kernel AIO。Libaio的APIs在<libaio.h>中,在编译的时候需要link libaio(-laio)。内核AIO(即io_submit()等)是内核对异步I/O操作的支持,其中io请求实际上在内核中排队,按照拥有的任何磁盘调度器排序,可能其中一些请求作为异步操作(使用TCQ或NCQ)被转发(以某种最优顺序)到实际磁盘。这种方法的主要限制是,并不是所有的文件系统都能很好地使用异步I/O(并且可能会退回到阻塞语义),并且文件必须使用O_DIRECT打开,这对I/O请求有很多其他限制。如果无法使用O_DIRECT打开文件,它可能仍然"工作",因为您可以获得正确的数据,但它可能不是异步完成的,而是回落到阻塞语义。

实际上,原生的 Linux AIO 有蠻多大大小小的问题,所以并不是真的太流行,linus也痛骂过AIO的设计

4.io_uring

待补充,参考资料1参考资料2

相关推荐
allway26 小时前
基于华为taishan200服务器、arm架构kunpeng920 cpu的虚拟化实战
linux·运维·服务器
CSCN新手听安6 小时前
【linux】高级IO,I/O多路转接之poll,接口和原理讲解,poll版本的TCP服务器
linux·运维·服务器·c++·计算机网络·高级io·poll
杜子不疼.6 小时前
【Linux】教你在 Linux 上搭建 Web 服务器,步骤清晰无门槛
linux·服务器·前端
CSCN新手听安6 小时前
【linux】网络基础(三)TCP服务端网络版本计算器的优化,Json的使用,服务器守护进程化daemon,重谈OSI七层模型
linux·服务器·网络·c++·tcp/ip·json
普马萨特6 小时前
GPS、WiFi、基站定位:为什么在 Agent 时代不仅不受影响,反而更重要
linux·运维·服务器
REDcker6 小时前
埋点系统设计:从成熟工具到自建方案
运维·服务器·网络·用户分析·埋点·埋点系统
予枫的编程笔记6 小时前
【Linux入门篇】Ubuntu和CentOS包管理不一样?apt与yum对比实操,看完再也不混淆
linux·人工智能·ubuntu·centos·linux包管理·linux新手教程·rpm离线安装
·云扬·7 小时前
MySQL Redo Log落盘机制深度解析
数据库·mysql
RisunJan7 小时前
Linux命令-lpr(从命令行提交文件到打印机打印)
linux·运维·服务器
历程里程碑7 小时前
Linux 库
java·linux·运维·服务器·数据结构·c++·算法