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

news2024/9/21 10:59:56

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

1. epoll

熟悉网络编程的人可能会想到select,poll,epoll这些异步IO的方式,但实际上这些方式叫做非阻塞IO,并不是实际意义上的异步IO。因此这些只能用于异步的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2086609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xline v0.7.0: 一个用于元数据管理的分布式KV存储

Xline是什么&#xff1f;我们为什么要做Xline&#xff1f; Xline是一个基于Curp协议的&#xff0c;用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议&#xff0c;需要两次RTT才能完成一次请求。当部署在单个数据中心时&#xff0c;节点之间的延迟较低&a…

【C++从小白到大牛】C++的隐式和显示类型转换基础知识讲解

目录 1、C语言中的类型转换 2、C语言和C中可以相互转换的类型总结 C语言&#xff1a; CPP&#xff1a; 3. 为什么C需要四种类型转换 4、C四大强制类型转换 4.1static_cast 4.2 reinterpret_cast 4.3 const_cast 4.4dynamic_cast 注…

吴恩达机器学习笔记 四十五 基于内容的过滤的tensorFlow实现

一个user网络&#xff0c;一个item网络 &#xff0c;使用顺序模型&#xff0c;激活函数选择relu&#xff0c;最后的输出大小都是32。 input_user提取特征&#xff0c;然后把这些特征送给上面的user_NN这个网络得到用户向量vu&#xff0c;再对vu进行标准化&#xff08;用l2范式&…

【最精简】解决访问GitHub慢的问题

我们通过命令行ping两个网站获取对应的IP地址 在windows中&#xff0c;修改hosts文件&#xff0c;路径一般是C:\Windows\System32\drivers\etc&#xff0c;用记事本打开&#xff0c;输入以下内容即可。 // 配置GitHub加速 199.232.69.194 github.global.ssl.fastly.net 140.8…

数据结构与算法 第3天(栈和队列)

栈和队列也是线性表&#xff0c;限制插入和删除的位置只能在端点 栈&#xff08;stack&#xff09; 后进先出 LIFO 表尾进入&#xff0c;表尾删除 一、案例 案例一&#xff1a;进制转换 例子 159转换成八进制 159/819...7 19/82...3 2/80...2 结果为237 案例二&#xff1a;括…

【香橙派系列教程】(二十) 系统移植、交叉编译工具链—OrangePi Zero2 SDK说明

【二十】基于OrangePi Zero2的系统移植—OrangePi Zero2 SDK说明 文章目录 【二十】基于OrangePi Zero2的系统移植—OrangePi Zero2 SDK说明1.使用环境要求2.Linux获取SDK3.首次编译完整SDK 之前我们在使用香橙派时&#xff0c; 都是直接在香橙派上进行代码编译&#xff0c; 但…

联华证券-新手炒股入门指南:学习路径与注意事项

学习炒股是一个循序渐进的过程&#xff0c;以下是入门建议以及需要注意的事项&#xff1a; 学习炒股的入手步骤 掌握基础知识&#xff1a; 股票市场基础&#xff1a;了解什么是股票、股市的运作机制、股票的种类等基本概念。 常用术语&#xff1a;熟悉如市盈率&#xff08;P/…

8.29c++

仿照string类&#xff0c;实现myString #include <iostream> #include <cstring> using namespace std; class myString { public://无参构造myString():size(10){strnew char[size];//堆区创建空间}//有参构造myString(const char *s){sizestrlen(s);//获取长度s…

TeamTalk消息服务器学习

msg_server发送消息 信令 //service id 0x0003 message IMMsgData{//cmd id: 0x0301required uint32 from_user_id 1; //消息发送方required uint32 to_session_id 2; //消息接受方required uint32 msg_id 3; // 非常重要&#xff1a;由谁产生&#xff1f;答&…

ShenNiusModularity项目源码学习(2:登录页面验证码)

前端登录页面Login.cshtml位于ShenNius.Admin.Mvc项目的Areas\Sys\Views\User内&#xff0c;页面中使用的验证码是调用同项目内UserController的OnGetVCode函数获取验证码图片。   点击验证码图片&#xff0c;会调用wwwroot\js\login.js定义的changeSrcCode函数刷新验证码。…

Qt调用外部exe并嵌入到Qt界面中(验证成功的成功)

http://t.csdnimg.cn/CDsqQ 原作者在这里 本文章主要介绍如何用Qt调用其他应用的exe,并将窗口嵌入到Qt界面中。很多人查到的代码都能成功的将exe调用起来&#xff0c;但是嵌入不到窗口中。主要有两种原因&#xff0c;现在从头到尾的梳理一下。 1.主要代码 1.1启动exe //包含…

keil编译输出的信息program size含义,以及个人使用中的编译内存溢出问题

keil编译后输出的信息含义 data对应的是片内的RAM&#xff0c;xdata对应的是程序中片外扩展的存储器上需要占用的容量&#xff0c;code是编写的程序占用单片机片内的存储程序ROM上的容量。 编译中发现错误 上图中的data值占用了147字节&#xff0c;超过了128字节。 一般解决…

2700+存储过程的超复杂Oracle,国产化怎么办?

前不久部门同事参与了一个关键客户的国产数据库Poc工作。从群里反馈的一些信息来看&#xff0c;难度还是比较大。 我们知道&#xff0c;对于数据库国产改造&#xff0c;其实有几个比较大的难点&#xff0c;其中最让人头疼的无非就是存储过程之类的对象了。 从同时提供的迁移报告…

掌握MySQL就差这一个——超详细讲解Mysql集群技术(包含主从复制,半同步模式,组复制,MHA)

一 Mysql 在服务器中的部署方法 在企业中 90% 的服务器操作系统均为 Linux 在企业中对于 Mysql 的安装通常用源码编译的方式来进行 官网&#xff1a; http://www.mysql.com 1.1 在Linux下部署mysql 1 安装依赖性&#xff1a; [rootmysql_node1 ~]# yum install cmake gcc-c…

django(二):第一个项目

接上文&#xff0c;django&#xff08;一&#xff09;&#xff1a;项目搭建开始开发第一个项目。 1. 新建app 创建一个app应用&#xff0c;取名为company。 python manage.py startapp company注册app到settings.py文件中。 2.实现Model层 settings.py文件中配置数据库&am…

软件测试学习笔记丨静态测试与代码审计 SonarQube

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32049 一&#xff0c;SonarQube 平台搭建 1.1&#xff0c; 介绍 Sonar 是一个用于代码质量管理的开放平台。通过插件机制&#xff0c;Sonar 可以集成不同的测试工具、代码分析工具&#xff…

FATE Board 执行流程探索

背景介绍 FATE Board 是 FATE 提供的一个工程&#xff0c;用于给 FATE 提供可视化能力&#xff0c;方便在联邦学习训练中实时查看执行状态&#xff0c;更好地定位执行中遇到的问题。 查看 FATE 架构可以看到 FATE Board 是建立在 MySQL 和 FATE Flow Server 的基础上的&#…

Unity(2022.3.41LTS) - 着色器

目录 一、着色器的基本概念 二、表面着色器 一、着色器的基本概念 定义与作用&#xff1a; 着色器是一种在图形硬件上运行的程序&#xff0c;用于控制物体的颜色、纹理、光照、透明度等视觉属性。它通过对输入的几何数据&#xff08;如顶点位置、法线、纹理坐标等&#xff09…

某地级市攻防演练突破边界实战

0x1前言 今年某地级市的攻防中&#xff0c;前期通过fofa、google语法、天眼查等待信息收集获取到了某集团的单位后台后台是这样的&#xff0c;当看到这个后台系统时候脸上 不直接也就微笑了起来。最近风声紧&#xff0c;所有厚码希望大家多多理解&#xff08;我也怕死啊呜呜呜…

【MRI基础】k空间基本属性

K 空间本质上是一个矩阵&#xff0c;用于存储从 MRI 扫描仪获得的原始数据。这些数据是在扫描过程中收集的&#xff0c;K 空间中的每个点代表被扫描身体发出的 MRI 信号的不同频率和相位。存储在 K 空间中的数据不是图像形式&#xff0c;而是包含重建图像所需的所有空间频率信息…