免费注册 查看新帖 |

Chinaunix

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

关于linux下异步IO操作的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-07 13:46 |只看该作者 |倒序浏览
Hello all:

关于linux下同步和异步IO操作,我有一个疑问:针对异步IO操作,linux专门提供了一组异步IO操作函数族,即aio_xxx

问题是,对于普通IO操作在open的时候,如果我没有指定NONBLOCK,那么对此文件描述符的操作就都是异步的(即进程并不会等待IO操作完成才返回),那么这和用aio_xxx函数族有什么区别吗?

还是说aio_xxx函数族只是提供了另外一种方式?而这种方式不用aio_xxx还是可以实现?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2008-11-07 14:16 |只看该作者
你仔细看看它们的文档区别就出来了。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2008-11-07 14:20 |只看该作者
原帖由 NewCore 于 2008-11-7 13:46 发表
对于普通IO操作在open的时候,如果我没有指定NONBLOCK,那么对此文件描述符的操作就都是异步的

没有指定 NONBLOCK 操作是同步的。

论坛徽章:
0
4 [报告]
发表于 2008-11-07 15:27 |只看该作者
原帖由 MMMIX 于 2008-11-7 14:20 发表

没有指定 NONBLOCK 操作是同步的。


对的,笔误,写错了。

google到一篇介绍比较详细的文章,http://www.ibm.com/developerworks/cn/linux/l-async/

以read为例,我的理解是:

阻塞和非阻塞主要针对调用read是否等待IO操作完成而言
同步和异步主要针对调用read的时机而言

现在我有个问题:文中列举的4种方式中,哪几种是会导致进程挂起的?

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
5 [报告]
发表于 2008-11-07 20:28 |只看该作者
原帖由 NewCore 于 2008-11-7 15:27 发表
现在我有个问题:文中列举的4种方式中,哪几种是会导致进程挂起的?
...


异步可以认为实际的IO操作与用户程序调用read后的逻辑是并行的。同步和异步都能挂起,可以控制


阻塞和非阻塞主要针对调用read是否等待IO操作完成而言

这才是同步与异步的区别。


同步和异步主要针对调用read的时机而言

这才是阻塞和非阻塞的区别。

论坛徽章:
0
6 [报告]
发表于 2008-11-07 21:09 |只看该作者

回复 #5 timespace 的帖子

请看看http://www.ibm.com/developerworks/cn/linux/l-async/这篇文章的图2,和图3

图 2. 同步阻塞 I/O 模型的典型流程
图 3. 同步非阻塞 I/O 模型的典型流程

比较两个的区别在于read是否等待IO操作结束才返回,不是吗?

论坛徽章:
0
7 [报告]
发表于 2008-11-07 21:11 |只看该作者
原帖由 timespace 于 2008-11-7 20:28 发表


异步可以认为实际的IO操作与用户程序调用read后的逻辑是并行的。同步和异步都能挂起,可以控制



这才是同步与异步的区别。



这才是阻塞和非阻塞的区别。


这个问题时因为看了这篇文章,http://zhanjun.net/?q=node/7,其中:
“阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。”

感觉自己一直没有把这个问题理解清楚,郁闷。

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
8 [报告]
发表于 2008-11-07 21:46 |只看该作者

回复 #6 NewCore 的帖子

非阻塞IO:当IO操作不能立即完成,可能引起程序阻塞时,会返回一个错误,此时IO操作都没有开始,何来结束?如果操作可以立即完成,就直接进行IO操作,同样要等待IO结束时调用返回;在进行真正IO时,阻塞和非阻塞没有区别,都要等到IO结束才会返回;所以说它们真正的区别是在如果IO不能立即完成,阻塞IO的程序会阻塞,非阻塞IO的程序会立即返回错误而不进行IO请求,即它们区别在于选择IO的时机(IO是否能立即完成)。

异步IO:逻辑上相当于开启单独一个线程来进行IO,异步IO对于调用方来说始终是非阻塞的,它发出请求后就立即返回,不需要等待IO完成;而同步IO,不管是阻塞还是非阻塞可以进行IO时,都要等待IO结束才返回

评分

参与人数 1可用积分 +15 收起 理由
MMMIX + 15 相当透彻

查看全部评分

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2008-11-07 21:51 |只看该作者
这个问题可以看下 APUE2 的相关章节。

另外,关于 “write 完成” 这个说法,要注意区分到底指的是将要写的数据加入内核缓冲区,还是已经写入硬盘。

论坛徽章:
0
10 [报告]
发表于 2008-11-09 12:08 |只看该作者

回复 #8 timespace 的帖子

谢谢,说得很清楚。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP