使用异步IO大大提高应用程序的性能之一

使用异步 I/O 大大提高应用程序的性能 AIO 简介 Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。它是 2.6 版本内核的一个标准特性,但是我们在 2.4 版本内核的补丁中也可以找到它。AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果。 I/O 模型 在深入介绍 AIO API 之前,让我们先来探索一下 Linux 上可以使用的不同 I/O 模型。这并不是一个详尽的介绍,但是我们将试图介绍最常用的一些 阅读详情

转自:http://blog.chinaunix.net/uid-26000296-id-3754543.html


学习何时以及如何使用 POSIX AIO API
M. Tim Jones (mtj@mtjones.com), 顾问工程师, Emulex
简介: 
Linux? 中最常用的输入/输出(I/O)模型是同步 I/O。
在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。
这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需要使用任何中央处理单元(CPU)。
但是在某些情况中,I/O 请求可能需要与其他进程产生交叠(并行)。
可移植操作系统接口(POSIX)异步 I/O(AIO)应用程序接口(API)就提供了这种功能。
在本文中,我们将对这个 API 概要进行介绍,并来了解一下如何使用它。

一、AIO 简介
Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。
它是 2.6 版本内核的一个标准特性,但是我们在 2.4 版本内核的补丁中也可以找到它。
AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。
稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果。


二、I/O 模型
在深入介绍 AIO API 之前,让我们先来探索一下 Linux 上可以使用的不同 I/O 模型。
这并不是一个详尽的介绍,但是我们将试图介绍最常用的一些模型来解释它们与异步 I/O 之间的区别。
图 1 给出了同步和异步模型,以及阻塞和非阻塞的模型。


图 1. 基本 Linux I/O 模型的简单矩阵

基本 Linux I/O 模型的简单矩阵 
每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序都有自己的优点。
本节将简要对其一 一进行介绍。


三、I/O 密集型与 CPU 密集型进程的比较
I/O 密集型进程所执行的 I/O 操作       >  执行的处理操作。
CPU 密集型的进程所执行的处理操作  >  I/O 操作。
Linux 2.6 的调度器实际上更加偏爱 I/O 密集型的进程,
因为它们通常会发起一个 I/O 操作,然后进行阻塞,这就意味着其他工作都可以在两者之间有效地交错进行。

四、同步阻塞 I/O
最常用的一个模型是同步阻塞 I/O 模型。
在这个模型中,用户空间的应用程序执行一个系统调用,这会导致应用程序阻塞。
这意味着应用程序会一直阻塞,直到系统调用完成为止(数据传输完成或发生错误)。
调用应用程序处于一种不再消费 CPU 而只是简单等待响应的状态,因此从处理的角度来看,这是非常有效的。
图 2 给出了传统的阻塞 I/O 模型,这也是目前应用程序中最为常用的一种模型。
其行为非常容易理解,其用法对于典型的应用程序来说都非常有效。
steps:
a. 在调用 read 系统调用时,应用程序会阻塞并对内核进行上下文切换。
b. 然后会触发读操作,
c. 当响应返回时(从我们正在从中读取的设备中返回),数据就被移动到用户空间的缓冲区中。
d. 然后应用程序就会解除阻塞(read 调用返回)。
图 2. 同步阻塞 I/O 模型的典型流程
同步阻塞 I/O 模型的典型流程 

从应用程序的角度来说,read 调用会延续很长时间。
实际上,在内核执行读操作和其他工作时,应用程序的确会被阻塞。

五、同步非阻塞 I/O
同步阻塞 I/O 的一种效率稍低的变种是同步非阻塞 I/O。
在这种模型中,设备是以非阻塞的形式打开的。
这意味着 I/O 操作不会立即完成,read 操作可能会返回一个错误代码,
说明这个命令不能立即满足(EAGAIN 或 EWOULDBLOCK),如图 3 所示。

图 3. 同步非阻塞 I/O 模型的典型流程
同步非阻塞 I/O 模型的典型流程 
非阻塞的实现是 I/O 命令可能并不会立即满足,需要应用程序调用许多次来等待操作完成。
这可能效率不高,
因为在很多情况下,当内核执行这个命令时,应用程序必须要进行忙碌等待,直到数据可用为止,
或者试图执行其他工作。
正如图 3 所示的一样,这个方法可以引入 I/O 操作的延时,
因为数据在内核中变为可用到用户调用 read 返回数据之间存在一定的间隔,这会导致整体数据吞吐量的降低。


六、异步阻塞 I/O
另外一个阻塞解决方案是带有阻塞通知的非阻塞 I/O。
在这种模型中,配置的是非阻塞 I/O,然后使用阻塞 select 系统调用来确定一个 I/O 描述符何时有操作。
使 select 调用非常有趣的是它可以用来为多个描述符提供通知,而不仅仅为一个描述符提供通知。
对于每个提示符来说,我们可以请求这个描述符可以写数据、有读数据可用以及是否发生错误的通知。

图 4. 异步阻塞 I/O 模型的典型流程 (select)
异步阻塞 I/O 模型的典型流程 

select 调用的主要问题是它的效率不是非常高。
尽管这是异步通知使用的一种方便模型,但是对于高性能的 I/O 操作来说不建议使用。


七、异步非阻塞 I/O(AIO)
最后,异步非阻塞 I/O 模型是一种处理与 I/O 重叠(并行)进行的模型。
steps:
a. 读请求会立即返回,说明 read 请求已经成功发起了。
b. 在后台完成读操作时,应用程序然后会执行其他处理操作。
c. 当 read 的响应到达时,就会产生一个信号或执行一个基于线程的回调函数来完成这次 I/O 处理过程。

图 5. 异步非阻塞 I/O 模型的典型流程
异步非阻塞 I/O 模型的典型流程 
在一个进程中为了执行多个 I/O 请求而对计算操作和 I/O 处理进行重叠(并行)处理的能力
利用了处理速度与 I/O 速度之间的差异。
当一个或多个 I/O 请求挂起时,CPU 可以执行其他任务;
或者更为常见的是,在发起其他 I/O 的同时对已经完成的 I/O 进行操作。

Rust:性能优异的异步并发库 Tokio Tokio是一个开源的异步运行时库,专为编写异步IO应用而设计。它提供了一种简单而安全的方式来编写异步代码,允许开发者无缝切换不同类型的异步运行时,并提供了统一的接口用于实现不同的功能,如网络IO、文件IO、数据库访问、HTTP客户端、多线程调度等。Tokio基于Rust语言开发,Rust是一种赋予每个人建立可靠和高效的软件的语言。Tokio的目标是通过提供一种简洁而强大的抽象层,使得异步编程更加容易和直观。它专注于提供一致的行为和可靠的响应时间,以构建可信的软件。 阅读详情

相关推荐

对冲策略与马丁结合ea的编程实践(五)核心是把两个品种合成一个新品种

在外汇、数字货币、期货交易甚至赌博中,马丁策略、网格策略是最常用的策略,也是最容易被理解的策略,但是如何克服单边行情、极端行情,是使用马丁策略最为头疼的事情,如加大间距、加大资金量,只能缓解,并不能根本解决这样的情况,所以使用时大部分时候都心里没底。 有没有一种正确的思路,让行情控制在震荡范围以内呢,这是今天我要向大家分享的一个思路,那就是对冲。大家看下图: 大家可以看到欧美(EURUSD)和镑美(GBPUSD),这两个品种,大部分时候走势是一致的,那么我们有没有可能把他们两个品种进行一下合成,比如买0.

omidsky的博客 3738

linux异步IO的几种方法及重点案例

这些异步I/O机制各自有其特点和适用场景。POSIX AIO是标准的异步I/O机制,可在不同的操作系统上使用,但在Linux上的实现可能较为有限。epoll和kqueue是针对Linux和BSD系统的高性能事件通知机制,适用于大规模的并发I/O操作。IOCP(I/O Completion Ports):IOCP是Windows系统提供的异步I/O机制,但也可以在Linux上使用。POSIX AIO(Asynchronous I/O):POSIX AIO是一种标准的异步I/O机制,定义在POSIX标准中。

最后一个bug的博客 1369

电机控制-PMSM无感FOC控制(五)SVPWM过调制策略优化与谐波抑制

本文深入探讨了PMSM无感FOC控制中的SVPWM过调制策略优化与谐波抑制。针对电机高速运行时电压利用率不足的问题,分析了过调制技术的必要性,并详细阐述了分区过调制、谐波注入及闭环优化等主流策略,旨在提升电压利用率与抑制电流谐波,实现电机高性能控制。

convnet3designer的博客 353

Linux——高级IO

同步需要。

2301_80687320的博客 984

2023年高教社杯 | 2023年高教社杯全国大学生数学建模思路(A题思路、C题思路)

2023年高教社杯 | 2023年高教社杯全国大学生数学建模思路(A题思路、C题思路)

前程算法屋的博客 624

WordPress插件depicter存在SQL注入漏洞(CVE-2025-2011)

Depicter 是一款功能强大的 WordPress 幻灯片插件,允许用户通过直观的拖放编辑器轻松创建响应式滑块、轮播和动态内容展示。该插件提供丰富的模板库、动画效果和图层控制,支持多媒体内容嵌入(如图片、视频、HTML),并优化了移动端显示和SEO性能。其无代码操作界面适合非技术用户,同时提供高级自定义选项,适用于产品展示、营销推广和视觉叙事等多种场景,是提升网站视觉吸引力的高效工具。

m0_50125527的博客 550

Linux 网络IO管理(单线程实现百万并发连接)

当用户进程调用了 read 这个系统调用,kernel 就开始了 IO 的第一个阶段:准备数据。对于network io 来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的数据包),这个时候 kernel 就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。当 kernel一直等到数据准备好了,它就会将数据从 kernel 中拷贝到用户内存,然后 kernel 返回结果,用户进程才解除 block 的状态,重新运行起来。所以,blocking IO 的特点就是在 IO 执行的两个阶段(

weixin_45715405的博客 985

大数据分析案例-基于决策树算法构建世界杯比赛预测模型

本项目旨在分析往届世界杯比赛数据,找出规律,最后使用决策树算法构建世界杯比赛预测模型,给出两个球队即可预测胜率,可以给爱看球的小伙伴提供一个参考。本次实验我们使用了2018年及其之前的世界杯比赛数据,通过建立决策树模型,模型准确率为82%,接着我们使用该模型预测了2022年世界杯的5场半决赛及决赛,模型准确率也是接近80%的,说明模型效果还是很不错的。心得与体会:通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。

m0_64336780的博客 1万+

Linux AIO机制

Linux的I/O机制经历了一下几个阶段的演进:1. 同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。2. 同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可以立即返回,但是并不保证I/O操作成功。3. 异步事件阻塞I/O: 用户进程可以对I/O事件进行阻塞,但是I/O操作并不阻塞。通过select/poll/epoll等函数调用来达

缘分天空 1万+

【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)

俯视角射击游戏)是一类以俯视视角进行游戏展示的射击游戏。在这种游戏中,玩家控制着一个角色或载具,从俯视的角度上方观察游戏世界,并与敌人进行战斗。这种视角使玩家能够有更好的全局观察和策略性,同时也强调快速反应和精确射击。视角:俯视角度可以是固定的,也可以随着玩家角色的移动而变化,但都允许玩家以全局视角观察整个战场,有利于制定战略和规划行动。射击:玩家通常需要使用各种武器来与敌人进行战斗,包括枪械、爆炸物等。射击动作依赖于玩家的反应速度和准确性。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 7830

QGis二次开发 —— 1、win10/win11搭建Vs2017-QGis3.40.12环境(附Vs2017环境效果,附全部问题解决方法)(附:Qt助手加入QGis接口说明文档)

QGis二次开发 —— 1、Windows10搭建Vs2017-QGis环境(附Vs2017环境效果)(附:Qt助手加入QGisA接口说明文档)

1362

使用异步IO大大提高应用程序的性能之二

紧接上文 下一节将深入介绍这种模型,探索这种模型使用的 API,然后展示几个命令。 一、异步 I/O 的动机 从前面 I/O 模型的分类中,我们可以看出 AIO 的动机。 a. 阻塞模型需要在 I/O 操作开始时阻塞应用程序,这意味着不可能同时重叠进行处理和 I/O 操作。 b. 同步非阻塞模型允许处理和 I/O 操作重叠进行,但是这需要应用程序根据重现的规则来检查 I/O

北雨南萍 1009

大厂面试:字节跳动大数据面试题及参考答案(10万字长文及多张原理图持续更新)

在 Spark 中,宽窄依赖是用来描述 RDD(弹性分布式数据集)之间的依赖关系的概念。窄依赖是指父 RDD 的每个分区最多被一个子 RDD 的分区使用,即子 RDD 的分区可以通过确定的规则从父 RDD 的分区计算得到,并且不需要跨节点进行数据传输。窄依赖通常可以在一个节点上进行计算,不需要进行数据的 shuffle 操作,因此性能较高。宽依赖是指父 RDD 的一个分区可能被多个子 RDD 的分区使用,即子 RDD 的分区需要通过跨节点的数据 shuffle 操作从父 RDD 的多个分区获取数据。

大模型大数据攻城狮的专栏 1650

Linux应用:异步IO、存储映射IO、显存的内存映射

全部刷新实现简单,但效率较低;更新刷新能提高效率,但实现复杂度较高,需要额外的处理来检测变化区域。在实际应用中,要根据具体的需求和场景选择合适的刷新方式。

qq_43441284的博客 2014

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

深入解剖io_uring:Linux异步IO的终极武器

摘要:本文深入探讨了Linux I/O模型的演进历程,从早期阻塞式I/O到现代高性能异步I/O框架io_uring的发展。重点分析了io_uring的设计理念、核心机制以及与epoll等传统模型的对比。io_uring通过共享环形缓冲区实现用户态与内核态高效通信,支持批量操作和零拷贝技术,显著提升了I/O性能。文章详细解析了io_uring的工作原理、系统调用接口,并通过文件读写和网络编程案例展示其应用方式。测试结果表明,在高并发场景下,io_uring的性能表现优于传统I/O模型。最后讨论了使用io_ur

深度Linux 1659

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

使用异步 I/O 大大提高应用程序的性能、学习何时以及如何使用 POSIX AIO API

https://www.ibm.com/developerworks/cn/linux/l-async/ AIO 简介 Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。它是 2.6 版本内核的一个标准特性,但是我们在 2.4 版本内核的补丁中也可以找到它。AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完...

小豆角的博客 285

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux中使用异步 I/O 大大提高应用程序的性能

AIO 简介 Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。它是 2.6 版本内核的一个标准特性,但是我们在 2.4 版本内核的补丁中也可以找到它。AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果。 I/O 模型 在深入介绍 AIO API 之前,让

whereismatrix的专栏 605

Python教程(十七):协程、 asyncio与 aiohttp【异步IO】

使用async def异步 IO 是提高 Python 程序性能的强大工具。通过asyncio和aiohttp,你可以构建高效、可扩展的异步应用程序。使你在处理高并发场景时更加得心应手。

前端探索者 1842

Linux下使用异步 I/O 大大提高应用程序的性能

Linux® 中最常用的输入/输出(I/O)模型是同步 I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需要使用任何中央处理单元(CPU)。但是在某些情况中,I/O 请求可能需要与其他进程产生交叠。可移植操作系统接口(POSIX)异步 I/O(AIO)应用程序接口(API)就提供了这种功能。在本文中,我们

李亚锋的专栏 1488
上一篇: IO中同步、异步与阻塞、非阻塞的区别
下一篇: 使用异步IO大大提高应用程序的性能之二
forfuture3513
博客等级 码龄15年 76粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值