免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 65234 | 回复: 26
打印 上一主题 下一主题

[技术动态] 关于AIO的一个疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
[收藏(0)] [报告]
发表于 2014-10-24 12:18 |只看该作者 |正序浏览
纯理论讨论,AIO的效率高在哪个部分,以下理解不正确的地方请指出:
IO处理分为2个部分,IO请求+IO处理(IO处理又分为磁盘拷贝数据+内核用户空间拷贝),  AIO指应用程序发IO请求,后续工作全部由操作系统完成,那么看下面的2种模型:
1. epoll + AIO
2. epoll + NIO
AIO的优势在哪里呢?在以上IO处理过程中,只有磁盘拷贝不占用CPU,但是在epoll+NIO模型中,epoll返回可读时,fd的buffer应该是已经有数据存在了,实际上也没有浪费CPU资源;
感觉2种模型仅仅是数据拷贝一个是内核在做,一个是应用程序在做,但是都占用CPU,这样说来AIO没什么优势啊。

希望说清楚了我的疑问,望指教。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
26 [报告]
发表于 2020-09-13 14:51 |只看该作者
本帖最后由 yulihua49 于 2020-09-14 09:36 编辑
gqbfree 发表于 2014-10-25 23:07
用别的CPU去完成拷贝,不也是消耗了总性能么?  假设所有的CPU都在高速的运行中。我觉得单从理论上讲,AIO ...

现在我知道了。
在网络比较阻塞的条件下,传送大包数据,NIO会不断地挂起,不断的回调,期间开销非常大。AIO可以一次性挂起,完成后回调。效率高很多。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
25 [报告]
发表于 2020-09-13 14:50 |只看该作者
gqbfree 发表于 2014-10-29 10:10
@yulihua49   @zylthinking   @linux_c_py_php   炸出来

6年后炸出来了。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
24 [报告]
发表于 2015-03-24 16:25 |只看该作者
本帖最后由 yulihua49 于 2015-03-24 16:35 编辑
gqbfree 发表于 2014-10-24 12:18
纯理论讨论,AIO的效率高在哪个部分,以下理解不正确的地方请指出:
IO处理分为2个部分,IO请求+IO处理(I ...

SOCKET 就 NIO + epoll
文件,就 AIO + eventfd + epoll。
因为NIO对文件无效。而SOCKET使用AIO还需要另外的eventfd,还要页边界对齐的buffer,太麻烦了。

http://bbs.chinaunix.net/thread-4077904-3-1.html
25楼的传送文件的服务器程序,第三行就是AIO,13行就是NIO。在这两处都可能yield。
这都不是为了什么效率问题,而是在少线程服务器的条件下,让那些等待IO的任务能够腾出线程来为别的任务服务。
改善服务器的用户体验。

论坛徽章:
0
23 [报告]
发表于 2014-11-10 16:43 |只看该作者
回复 26# cobras
虽然我心里还是有那个疑问   还是多谢底层的分析。  

   

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
22 [报告]
发表于 2014-11-07 17:18 |只看该作者
实际上中断是配合DMA来完成AIO工作的。先对中断控制器和DMA控制器布置任务。待DMA将数据复制完成后,调用中断程序进行处理。此时数据已经在指定的内存中了。
如果系统在给DMA指定内存时直接将用户的数据区指定给DMA。则可以不用进行数据复制。此时的AIO效率最高。但实际系统是DMA对数据区有诸多的限制。造成不可能这样完成任务。一般都是直接指定内核的缓冲区,然后再复制到用户数据区。这就造成了一次IO和一次数据复制。
EPOLL的实现应该是这样的。就是IO中断后,不直接复制数据到用户数据区。而是设置状态。通过用户态代码来主动复制内核缓冲区数据。
所以这样看来。AIO与EPOLL的区别仅是复制数据的先后问题。实际实现可能有所区别。因为EPOLL可以同时处理大量的文件描述符。而这也就造成了对于文件描述符数据发生的频率的不同,EPOLL的效率将有很大的差异。

论坛徽章:
0
21 [报告]
发表于 2014-11-07 12:11 |只看该作者
回复 18# yulihua49
不知道为什么,回复的帖子会消失。看看记录,说是 已忽略。  怎么恢复呢?


   

论坛徽章:
0
20 [报告]
发表于 2014-11-07 12:08 |只看该作者
回复 21# cobras
我明白AIO的思想,这个思想没有问题。  设置一个回调,然后不阻塞的继续处理手上的事情。
但是在我帖子里面的这个具体问题上,我是想搞清楚 EPOLL+AIO 是否比 EPOLL+NIO 性能上更具优势? 优势又是在哪里呢?
因为从网上搜索的结果看,AIO给人感觉是更先进的一种技术。 例如刚刚贴的IBM那位的帖子:
http://www.ibm.com/developerworks/cn/linux/l-async/


   

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
19 [报告]
发表于 2014-11-07 06:30 来自手机 |只看该作者
再来看EPOLL。不管再怎么E,它也是POLL。不是吗?看看EPOLL的实现代码,可以肯定有AIO的影子。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
18 [报告]
发表于 2014-11-07 06:17 来自手机 |只看该作者
中断控制器的中断就是AIO。中断可是现代电脑体系结构的基础。如果硬件都是AIO实现的,当然使用AIO会有最小的转换损失。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
17 [报告]
发表于 2014-11-05 23:03 |只看该作者
本帖最后由 yulihua49 于 2014-11-06 10:52 编辑
gqbfree 发表于 2014-11-05 22:39
回复 16# yulihua49
关于AIO,请参考一下网上流传比较广的一篇 http://www.ibm.com/developerworks/cn/li ...

这种AIO没什么实际意义。

A出去后,再循环等待,轮询。。。。。吃饱了撑的。。。。

真正的异步,是发射后不管,后续任务由别的线程完成。这必须通过诸如epoll之类的事件器来触发后续线程处理。

对异步操作的需求:
1.任务发射后不管,可以注册一个“完成事件”,不一定由哪个线程执行。
2.不管前述任务是否完成,可以继续发射后续任务。
3.所有任务后台并行执行,完成的先后次序无关紧要。
4.无需查询任务是否完成。可设置超时条件,届时没有“完成事件”视作异常。

AIO显然不能满足需求。
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP