码迷,mamicode.com
首页 > 其他好文 > 详细

IO模型

时间:2016-06-22 01:38:03      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:

    关于网络IO的模型涉及到的阻塞、非阻塞、同步、异步真的是让人一头雾水啊。

    首先要了解需求,这个IO模型能够解决什么问题,在我理解就是,当应用程序要使用系统资源,但是这个资源又被占用的时候应该怎么办。比如说你去餐馆,可是菜又没有好,你该怎么办。

首先要明白的就是应用程序使用系统资源的一个过程,主要有两步:
第一步:请求,应用程序发起系统调用请求资源。
第二步:操作,内核获取到数据保存在内核空间,再将数据拷贝到应用程序的内存空间中。

    然后就是阻塞和非阻塞的问题了。很容易跟同步、异步混淆。
什么是阻塞?就是程序执行流程过来的时候你把它扣押起来,让它哪都不能去,什么也干不了。简单来说就是一个操作能不能立刻得到回应,可以立刻得到返回就是非阻塞,只要是需要等待,那就是阻塞。而阻塞会存在于以上两个步骤,即请求的时候可能被阻塞,实际复制数据的时候也可能被阻塞。

    那么同步异步的问题呢,有些说同步会把应用程序进程阻塞,异步不会,那同步和阻塞不就一样了么。其实这里按照我的理解就是,同步异步只是对于上述第二个步骤(IO操作)而言的,同步的情况下,你到内核空间复制数据我就把你阻塞了。如果请求过来,发现数据都还没准备好,那就不会发生读取数据的操作,请求也不会被阻塞。

下面两张图片取自open文档--网络I/O模型剖析.pdf

技术分享

技术分享

这里推荐一篇挺好的博文:《IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇) 》,而各个模型的具体代码可以参阅《几种服务器端IO模型的简单介绍及实现

那么就简单说说各个模型,图片来源于UNIX网络编程一书

1、阻塞IO

技术分享

2、非阻塞IO:

技术分享

3、IO复用:

技术分享

4、信号驱动IO:

技术分享

5、异步IO:
技术分享

根据上述做个简单的举例,就以一个买报纸比喻为数据的读取,但是报纸不是你想买就有的,如果没有(即进程读取数据时,系统并未准备好数据),那应该怎么办。针对上述描述有几种解决方案

1、阻塞I/O, 一天早上你大老早去找报摊老伯买当天报纸,结果告诉你,你来得太早了想要的报纸还没有(也就是进程想要读取的数据被其他占用了,不能马上得到想要的数据),这个时候你就干脆等着,等老板什么时候拿到报纸再给你,老板给你一张小板凳,你什么事情都不做,坐等拿到报纸后就撤退!这里的阻塞分了两部分,一个是你等老板(IO的请求),另一个是老板也在等送报人按照订购清单派发后清点种类和数量(IO操作),你们两个人都在等,所以两个阶段都是阻塞的。

2、非阻塞I/O, 这种情况是你老板没有小板凳,而你也不想一直等着,等着的时间浪费了还不如干点其他事情。所以你先离开了,然后每隔一段时间就跑回来看看想要的报纸有没有,这种不是一直等待的就是非阻塞,可是对于老板来说他要等着从送报员手中收到报纸,这过程也算是阻塞,而老板还是要清点核对订购的报纸,最后才确认收取(这是IO的实际操作了,相当于内核从磁盘读取数据,读取完之后再进行另一个步骤,从内核复制到进程内存)

3、I/O多路复用, 上面第二种方式可以发现有很大缺陷了,你需要不断地去看报纸送到老板手上了没有,一来二去的想想都累,尤其是当你要的多份报纸要在几个地方才能买到,这样你就需要每个地方反复的去看一遍有没有到货,累成狗了吧。这个时候多路复用的功能就是,你找个人来帮你跑,这个人会定时地将每个报亭的报纸是否有库存记录下来,你要做的事情只需要定时地找这个中介询问,一旦发现某个报亭有了你想要的报纸你就知道了,当某次得知所有报亭都已经到货,你就可以走一圈买到所有报纸。

4、信号驱动, 虽然不用亲自跑到各个报刊亭了解情况,但是仍然需要定时去询问卖报的中介代理人,还是避免不了多次询问的麻烦,于是你让中介在有你想要的信息的时候主动通知你,你再去拿报纸。这样就好多了,你足不出户就知天下事,该出手时就出手,保证每次都可以在报刊亭的报纸到达时就去取。

5、异步I/O, 这个就是高科技了,你去报刊亭问老板有没有你想要的报纸,老板说还没有,然后你就不等了,去干其他事情,你也不需要反复去询问最新情况了,当老板收到了报纸的时候,会给你送货上门,一站式服务啊!

以上几种情况的举例纯属基于个人理解,如有不当之处欢迎提出共同学习。另外有篇文章写得还是不错的 chinaunix--网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

IO模型

标签:

原文地址:http://www.cnblogs.com/otherside/p/5605471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!