收藏 分享(赏)

IO - 同步,异步,阻塞,非阻塞.doc

上传人:jmydc 文档编号:7231269 上传时间:2019-05-10 格式:DOC 页数:5 大小:179KB
下载 相关 举报
IO - 同步,异步,阻塞,非阻塞.doc_第1页
第1页 / 共5页
IO - 同步,异步,阻塞,非阻塞.doc_第2页
第2页 / 共5页
IO - 同步,异步,阻塞,非阻塞.doc_第3页
第3页 / 共5页
IO - 同步,异步,阻塞,非阻塞.doc_第4页
第4页 / 共5页
IO - 同步,异步,阻塞,非阻塞.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、同步(synchronous) IO 和异步(asynchronous) IO,阻塞(blocking) IO 和非阻塞(non-blocking)IO 先看一个较低的层次。如果从 CPU 的角度看,其实大部分的 IO 都是异步的:因为 CPU启动这个 IO 操作后,就去干其它的事情了,一直到产生一个中断,告诉它 IO 完成了。“Most physical I/O is asynchronousthe CPU starts the transfer and goes off to do something else until the interrupt arrives. User progr

2、ams are much easier to write if the I/O operations are blockingafter a read system call the program is automatically suspended until the data are available in the buffer. It is up to the operating system to make operations that are actually interrupt-driven look blocking to the user programs.” (引自 M

3、odern Operating Systems, 2ed)不过,本文并不想探究那么底层的东东。作为程序员,更多的还是从应用层面来考虑。所以,以下重点介绍的是应用程序中能够采用的四种 IO 机制。关于图的解释,首先要清楚理解一个任务线:Application 是一个程序或者执行一个逻辑的函数,其中当它执行到 Read()方法的时候,就会通过 I/O 操作从服务器端的内核(Kernel ,也可能是逻辑方法)获取数据(initiate ) ,当数据从服务器端回到本地后,通过Read response 组装成 Application 所需要的数据,然后执行 application 接下来要做的事情。关

4、于例子的解释,完整的例子是现需要用银行卡在网上下单支付买东西,但是卡上没钱,所以需要去银行存钱首先,从最常用到的,也是最容易理解的同步阻塞 IO 说起。在 这个模型中,应用程序(application)为了执行这个 read 操作,会调用相应的一个system call,将系统控制权交给 kernel,然后就进行等待(这其实就是被阻塞了) 。kernel开始执行这个 system call,执行完毕后会向应用程序返回响应,应用程序得到响应后,就不再阻塞,并进行后面的工作。例如, “在调用 read 系统调用时,应用程序会阻塞并对内核进行上下文切换。然后会触发读操作,当响应返回时(从我们正在从中

5、读取的设备中返回) ,数据就被移动到用户空间的缓冲区中。然后应用程序就会解除阻塞(read 调用返回) 。 ”就好比你去一个银行柜台存钱。首先,你会将存钱的单子填好,然后交给柜员。这里,你就好比是 application,单子就是调用的 system call,柜员就是 kernel。提交好单子后,你就坐在柜台前等,相当于开始进行等待。柜员办好以后会给你一个回执,表示办好了,这就是 response。然后你就可以支付买东西了。注意,这个时候,如果你办完之后马上去查账,存的钱已经打到你的账户上了。后面你会发现, 这点很重要。接下来谈同步非阻塞 IO 。先看这个图,在 linux 下,应用程序可以

6、通过设置文件描述符的属性 O_NONBLOCK,I/O 操作可以立即返回,但是并不保证 I/O 操作成功。也 就是说,当应用程序设置了 O_NONBLOCK 之后,执行 write 操作,调用相应的system call,这个 system call 会从内核中立即返回。但是在这个返回的时间点,数据可能还没有被真正的写入到指定的地方。也就是说,kernel 只是很快的返回了这个 system call(这样,应用程序不会被这个 IO 操作 blocking) ,但是这个 system call 具体要执行的事情(写数据)可能并没有完成。而对于应用程序,虽然这个 IO 操作很快就返回了,但是它并

7、不知道这个 IO 操作是否真的成功了,如果想 知道,需要应用程序主动地去问kernel。同样的,你也需要填写汇款单然后交给柜员,柜员进行他的操作,但是告诉你10M 之后才能处理好(其实本身真实中,你可以干其他事情了,但是这里银行要求处理好,还必须让你签字) ,你也无法离开,就不停的催促询问柜台是否处理完毕,一直等到柜台完成后让你签字,你也才能继续下面的下单付账操作。再来谈谈异步阻塞 IO 。在 linux 中,常常通过 select/poll 来实现这种机制。以图为例,和 之前一样,应用程序要执行 read 操作,因此调用一个 system call,这个 system call被传递给了 k

8、ernel。但在应用程序这边,它调用 system call 之后,并不等待 kernel 返回response,这一点是和前面两种机制不一样的地方。这也是为什么它被称为异步的原因。但是为什么称其为阻塞 呢?这是因为虽然应用程序是一个异步的方式,但是 select()函数会将应用程序阻塞住,一直等到这个 system call 有结果返回了,再通知应用程序。也就是说, “在这种模型中,配置的是非阻塞 I/O,然后使用阻塞 select 系统调用来确定一个 I/O 描述符何时有操作。 ”所以,从 IO 操作的实际效果来看,异步阻塞 IO 和第一种同步阻塞 IO 是一样的,应用程序都是一直等到 I

9、O 操作成功之后(数据已经被写入或者读取) ,才开始进行下面的工作。异步阻塞 IO 的好处在于一个 select 函数可以为多个描述符提供通知,提高了并发性。一个银行柜台,现在有10个人(application,异步了若干这个方法)想存钱。按照现在银行的做法,一个个排队。第一个人先填存款单,然后提交, 然后柜员处理,然后给回执,成功后再轮到下一个人。大家应该都在银行排过对,这样的流程是很痛苦的。如果按照异步阻塞的机制,10个人都填好存款单,然后 都提交给柜台,提交完之后所有的 10个人就在银行大厅等待。这时候会专门有个人(select 同步方法,所以阻塞了),他会了解存款单处理的情况,一旦有存

10、款单处理完毕,他会将回执交给相应的 正在大厅等待的人,这个拿到回执的人就可以去干其他的事情了。最后,谈谈异步非阻塞 IO (即 AIO) 。这个概念相对前面两个反而更容易理解一些。如 图所示,应用程序提交 read 请求的 system call,然后,kernel 开始处理相应的 IO 操作,而同时,应用程序并不等 kernel 返回响应,就会开始执行其他的处理操作(应用程序没有被 IO 操 作所阻塞) 。当 kernel 执行完毕,返回 read 的响应,就会产生一个信号或执行一个基于线程的回调函数(或者通知等其他方式)来完成这次 I/O 处理过程。你将存款单交给柜台,然后直接在晚上下单买

11、东西。柜台办好以后会给用户发送一条短信,告知交易成功。这样你就直接点击付款了。从前面的介绍中可以看出,所谓的同步和异步,在这里指的是 application 和 kernel 之间的交互方式。如果 application 不需要等待 kernel 的回应而可以继续进行他接下来的方法或操作,那么它就是异步的。如果 application 提交完 IO 请求后,需要等待返回数据,那么它就是同步的。而阻塞和非阻塞,指的是 application 是否等待 IO 返回结果,这个结果可以是最后成功的数据结果,也是可以等待结果,更可能是失败结果。所以,当 IO 进入 kernel 之后,必须等待服务器的就是阻塞了线程。如果直接得到了某种结果就是未阻塞(如果 application 必须等到 IO 操作实际完成以后再执行下面的操作,那么它是阻塞的。反之,如果不等待 IO操作的完成就开始执行其它操作,那么它是非阻塞的,这个是其他前辈的理解,我放入这做个参考吧)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报