免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: SybaseLU
打印 上一主题 下一主题

同步I/O(阻塞I/O),异步I/O(非阻塞) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-02-11 19:23 |只看该作者
非阻塞任务中一定含有异步操作。

论坛徽章:
0
12 [报告]
发表于 2012-02-13 14:25 |只看该作者
Unix Networking Programming  
6.2 I/O Models 讲的很清楚  还有对比图
异步IO与非阻塞IO是两个概念
非阻塞IO是说没有数据可以读写立即返回 然后不断的尝试是否可以读写(polling )  但是真正读写的时候还是阻塞的, 应用程序要等到kernel完成系统调用才返回
异步IO是指在真正读写过程中 不必等到kernel完成系统调用才返回,而是立即返回。等kernel完成了IO读写之后再通知应用程序 象事件机制一样

论坛徽章:
0
13 [报告]
发表于 2012-02-14 23:12 |只看该作者
回复 1# SybaseLU
同步I/O(为什么叫做阻塞I/O),异步I/O(为什么叫做非阻塞)?


碰巧,我最近也遇到这样的问题。
在网上找了下。
目前我的理解是,由于阻塞可能发生在用户空间,系统调用,内核空间中。等待也分为忙等待即完全的占用CPU,和睡眠等待,,,。


http://www.cppblog.com/converse/archive/2009/05/13/82879.html
首先来解释同步和异步的概念,这两个概念与消息的通知机制有关.
其次再来解释一下阻塞和非阻塞,这两个概念与程序等待消息(无所谓同步或者异步)时的状态有关.”


   http://blog.csdn.net/tq02h2a/article/details/3825114
”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等函数调用来达到此目的。
4. 异步时间非阻塞I/O: 也叫做异步I/O(AIO),用户程序可以通过向内核发出I/O请求命令,不用等带I/O事件真正发生,可以继续做
           另外的事情,等I/O操作完成,内核会通过函数回调或者信号机制通知用户进程。这样很大程度提高了系统吞吐量。“

http://blog.csdn.net/historyasamirror/article/details/4270633
   

论坛徽章:
0
14 [报告]
发表于 2012-02-15 11:09 |只看该作者
按照常规:
同步IO:分成阻塞(block)和非阻塞(non-blocking)
同步非阻塞IO和异步IO的区别是什么?
非阻塞IO是应用直接到kernel(linux)的buffer取数据,如果buffer是空的,就直接返回了。
异步IO的取数据(如aio_read),根本不是到kernel的buffer取数据,他只是发一个指令(一般带一个应用层的buffer)到kernel,告诉kernel我要读数据,让kernel读到的数据到放应用层的buffer。调用者不干具体事情,读数据,放数据到buffer是kernel帮忙搞定。

LZ了解吗?

----------------
http://blog.csdn.net/herm_lib

论坛徽章:
0
15 [报告]
发表于 2012-02-27 14:23 |只看该作者
本帖最后由 digdeep126 于 2012-02-27 14:24 编辑

UNP 6.2 I/O Models
Synchronous I/O versus Asynchronous I/O
POSIX defines these two terms as follows:

A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes.

An asynchronous I/O operation does not cause the requesting process to be blocked.

论坛徽章:
0
16 [报告]
发表于 2012-02-29 17:00 |只看该作者
本帖最后由 251316192 于 2012-02-29 17:11 编辑

这个东西其实在应用层不太好说明。那么我就把驱动端的实现简要描述下。

阻塞 I/O
一个驱动当它无法立刻满足请求应当如何响应? 一个对 read 的调用可能当没
有数据时到来, 而以后会期待更多的数据. 或者一个进程可能试图写, 但是你的设备没有
准备好接受数据, 因为你的输出缓冲满了. 调用进程往往不关心这种问题; 程序员只希望
调用 read 或 write 并且使调用返回, 在必要的工作已完成后. 这样, 在这样的情形中,
你的驱动应当(缺省地)阻塞进程, 使它进入睡眠直到请求可继续.

poll 和 select
使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll,
select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一个
或多个文件而不阻塞. 这些调用也可阻塞进程直到任何一个给定集合的文件描述符可用来
读或写. 因此, 它们常常用在必须使用多输入输出流的应用程序, 而不必粘连在它们任何
一个上. 相同的功能常常由多个函数提供, 因为 2 个是由不同的团队在几乎相同时间完
成的: select 在 BSD Unix 中引入, 而 poll 是 System V 的解决方案. epoll 调用[23]23
添加在 2.5.45, 作为使查询函数扩展到几千个文件描述符的方法.

异步 I/O
增加到 2.6 内核的一个新的特性是异步 I/O 能力. 异步 I/O 允许用户空间来初始化操
作而不必等待它们的完成; 因此, 一个应用程序可以在它的 I/O 在进行中时做其他的处
理. 一个复杂的, 高性能的应用程序还可使用异步 I/O 来使多个操作在同一个时间进行.
异步 I/O 的实现是可选的, 并且很少几个驱动作者关心; 大部分设备不会从这个能力中
受益. 如同我们将在接下来的章节中见到的, 块和网络驱动在整个时间是完全异步的, 因
此只有字符驱动对于明确的异步 I/O 支持是候选的. 一个字符设备能够从这个支持中受
益, 如果有好的理由来使多个 I/O 操作在任一给定时间同时进行. 一个好例子是流化磁
带驱动, 这里这个驱动可停止并且明显慢下来如果 I/O 操作没有尽快到达. 一个应用程
序试图从一个流驱动中获得最好的性能, 可以使用异步 I/O 来使多个操作在任何时间准
备好进行.

异步通知
尽管阻塞和非阻塞操作和 select 方法的结合对于查询设备在大部分时间是足够的, 一些
情况还不能被我们迄今所见到的技术来有效地解决.
让我们想象一个进程, 在低优先级上执行一个长计算循环, 但是需要尽可能快的处理输入
数据. 如果这个进程在响应新的来自某些数据获取外设的报告, 它应当立刻知道当新数据
可用时. 这个应用程序可能被编写来调用 poll 有规律地检查数据, 但是, 对许多情况,
有更好的方法. 通过使能异步通知, 这个应用程序可能接受一个信号无论何时数据可用并
且不需要让自己去查询.
用户程序必须执行 2 个步骤来使能来自输入文件的异步通知. 首先, 它们指定一个进程
作为文件的拥有者. 当一个进程使用 fcntl 系统调用发出 F_SETOWN 命令, 这个拥有者
进程的 ID 被保存在 filp->f_owner 给以后使用. 这一步对内核知道通知谁是必要的.
为了真正使能异步通知, 用户程序必须设置 FASYNC 标志在设备中, 通过 F_SETFL fcntl
命令.

总的说来阻塞非阻塞是内核是否有做进程调度,同步是你能知道时序的,异步只是通知或者说配置,什么时候执行读写操作,是未知的。

论坛徽章:
0
17 [报告]
发表于 2012-09-26 12:09 |只看该作者
异步/同步是属于程序设计的范畴,不能简单的说1个函数是异步的还是同步的,例如不能说select是同步还是异步的;
阻塞/非阻塞则是相对于1个io函数而言的,例如read可以说是阻塞式的也可以是非阻塞的。

异步io设计,是指设计者在通知内核进行io操作后,不会等待io动作完成,而是转而去完成其他工作,内核在io完成后再发信号告知调用者io已经完成,设计目的是提高效率。
同步io设计,是指设计者必须确认io是否已经完成(不用管是成功的还是不成功的),再此基础上才能继续往下执行其他工作。
显然,异步io设计不会显式调用read,write,select等,因为这些工作是由内核完成并告知你的。也就是说,在异步设计中,讨论采用阻塞还是非阻塞是毫无意义的。
而同步io就不一样了,设计者必须确认io的结果后才能继续下面的工作。如果调用阻塞式io,则调用者会一直等到条件符号(或被信号中断),阻塞式函数返回。
如果调用非阻塞式io,则不管条件是否成立其立即返回。调用者依据其io结果(成功/失败等),进行下步工作(再进行io或执行其他工作)。

论坛徽章:
0
18 [报告]
发表于 2012-10-21 22:55 |只看该作者
本帖最后由 nalinaly 于 2012-10-21 22:56 编辑

理论上大家都讲的很多了
现在疑惑的是有句话:“使用异步 I/O 可以帮助我们构建 I/O 速度更快、效率更高的应用程序。如果我们的应用程序可以对处理和 I/O 操作重叠进行,那么 AIO 就可以帮助我们构建可以更高效地使用可用 CPU 资源的应用程序。”

请问有人可以举出具体实例么?
以我的理解来说:如果一定要新起一个线程或进程来专门处理IO,还是一样耗CPU,优越性究竟在哪?

论坛徽章:
0
19 [报告]
发表于 2012-10-22 11:09 |只看该作者
nalinaly 发表于 2012-10-21 22:55
理论上大家都讲的很多了
现在疑惑的是有句话:“使用异步 I/O 可以帮助我们构建 I/O 速度更快、效率更高的 ...

异步I/O一般都不会新起一个线程的。
举个简单的例子,windows的消息驱动,主线程有一个消息循环。
异步IO的话就是IO完成时往消息队列里插一条消息。然后消息循环会自然循环到这条消息。
而同步IO则是消息循环整个暂停,等待IO结果。
效率差别可想而知。

论坛徽章:
0
20 [报告]
发表于 2012-10-22 21:44 |只看该作者
qinggeng 发表于 2012-10-22 11:09
异步I/O一般都不会新起一个线程的。
举个简单的例子,windows的消息驱动,主线程有一个消息循环。
异步 ...


我的意思是新起一个线程专门做IO

异步IO的话就是IO完成时往消息队列里插一条消息。然后消息循环会自然循环到这条消息。
而同步IO则是消息循环整个暂停,等待IO结果。


我的意思总得有一个线程来做这个IO。

我的理解是:如果不是异步的话,可能会阻塞,效率可能确实不高,但也没多占用CPU啊。
所以:如果说是可以处理更大的吞吐量,可以理解。
      但如果说是更加高效(我理解的高效是花相同的CPU做更多的IO处理),不能理解。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP