网络IO,阻塞,非阻塞,异步,同步io的总结
2016-04-02 10:58
501 查看
1.前言
在网络编程中,阻塞、非阻塞、同步、异步经常被提到。unix网络编程第一卷第六章专门讨论五种不同的IO模型,讲的很详细,这里做一点总结。2、数据流向
网络IO操作实际过程涉及到内核和调用这个IO操作的进程。以read为例,read的具体操作分为以下两个部分:(1)内核等待数据可读
(2)将内核读到的数据拷贝到进程
详细过程如下图所示:
![](http://images.cnitblog.com/blog/305504/201308/12224938-4db3844232b84fb284d057a21df5f149.png)
3、网络IO模型详细分析
常见的IO模型有阻塞、非阻塞、IO多路复用,异步。以一个生动形象的例子来说明这四个概念。周末我和女友去逛街,中午饿了,我们准备去吃饭。周末人多,吃饭需要排队,我和女友有以下几种方案:(1)我和女友点完餐后,不知道什么时候能做好,只好坐在餐厅里面等,直到做好,然后吃完才离开。
女友本想还和我一起逛街的,但是不知道饭能什么时候做好,只好和我一起在餐厅等,而不能去逛街,直到吃完饭才能去逛街,中间等待做饭的时间浪费掉了。这就是典型的阻塞。网络中IO阻塞如下图所示:
![](http://images.cnitblog.com/blog/305504/201308/12230408-c8b30331f20a41dcb224d20719ffa1da.png)
(2)我女友不甘心白白在这等,又想去逛商场,又担心饭好了。所以我们逛一会,回来询问服务员饭好了没有,来来回回好多次,饭都还没吃都快累死了啦。这就是非阻塞。需要不断的询问,是否准备好。这一种非阻塞往往是通过轮询来实现的。这种情况就是非阻塞网络IO非阻塞如下图所示:
![](http://images.cnitblog.com/blog/305504/201308/12231306-35dca310d92e4184bd4c0b3f42bee2c1.png)
(3)与第二个方案差不多,餐厅安装了电子屏幕用来显示点餐的状态,这样我和女友逛街一会,回来就不用去询问服务员了,直接看电子屏幕就可以了。这样每个人的餐是否好了,都直接看电子屏幕就可以了,这就是典型的IO多路复用,如select、poll、epoll。网络IO具体模型如下图所示:
![](http://images.cnitblog.com/blog/305504/201308/12232204-08fdf03d1d8a40a68d2286c6c43fb036.png)
(4)女友不想逛街,又餐厅太吵了,回家好好休息一下。于是我们叫外卖,打个电话点餐,然后我和女友可以在家好好休息一下,饭好了送货员送到家里来。这就是典型的异步,只需要打个电话说一下,然后可以做自己的事情,饭好了就送来了。linux提供了AIO库函数实现异步,但是用的很少。目前有很多开源的异步IO库,例如libevent、libev、libuv。异步io真正的是内核在帮助我们处理事务,异步过程如下图所示:
![](http://images.cnitblog.com/blog/305504/201308/12233159-16ec6876a48d424d8e6b524d1fb91689.png)
4、同步与异步
实际上同步与异步是针对应用程序与内核的交互而言的。同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是否完成。异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通知进程IO完成。类似select poll实际上都不是异步的,而是用户自己去调用io函数去完成io事务。同步与异步如下图所示:![](http://images.cnitblog.com/blog/305504/201308/12233922-2a81723a872b4ac5a3395bcf778309b8.png)
5.阻塞与非阻塞
简单一点的理解就是:需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。详细区别如下图所示:![](http://images.cnitblog.com/blog/305504/201308/12234337-ea19e65c6c72464499a307e4a950148a.png)
相关文章推荐
- SOCKET通信中TCP、UDP数据包大小的确定
- 网络:socket 的基本使用
- Smurf攻击手段
- MAC地址全球唯一为什么还可以修改
- TCP的拥塞控制
- TCP连接建立与断开
- .NET软件工程师网络在线就业培训_周末上课,上海就业
- 网络工程师葵花宝典
- 两例网络超时的定位
- C++卷积神经网络实例:tiny_cnn代码详解(12)——从CNN中看多态性
- 路由技术之ip汇总方法(列表法)
- 扣丁学堂笔记第18天HttpURLConnection与HttpClient
- Bzoj:1324:Exca王者之剑:网络流,最小割
- Android开发之网络通讯详解
- go简易tcp socket客户端和服务器
- Genymotion添加模拟器时报“Unable to create virtual device,Server returned HTTP status code 0”
- centos 无线网络连接
- TCP的三次握手和四次挥手
- [javaEE] HTTP协议总结
- 1501 二叉树最大宽度和高度——http://codevs.cn/problem/1501/