标题:
网络编程状态
[打印本页]
作者:
look_w
时间:
2017-9-23 15:07
标题:
网络编程状态
本帖最后由 look_w 于 2017-9-23 15:43 编辑
1
、前言
在网络编程中,阻塞、非阻塞、同步、异步经常被提到。unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,网上有详细的分析:。我结合网上博客和书总结一下,加以区别,加深理解。
2
、数据流向
网络IO操作实际过程涉及到内核和调用这个IO操作的进程。以read为例,read的具体操作分为以下两个部分:
(1)内核等待数据可读
(2)将内核读到的数据拷贝到进程
详细过程如下图所示:
3
、网络
IO
模型详细分析
常见的IO模型有阻塞、非阻塞、IO多路复用,异步。以一个生动形象的例子来说明这四个概念。周末我和女友去逛街,中午饿了,我们准备去吃饭。周末人多,吃饭需要排队,我和女友有以下几种方案:
(1)我和女友点完餐后,不知道什么时候能做好,只好坐在餐厅里面等,直到做好,然后吃完才离开。
女友本想还和我一起逛街的,但是不知道饭能什么时候做好,只好和我一起在餐厅等,而不能去逛街,直到吃完饭才能去逛街,中间等待做饭的时间浪费掉了。这就是典型的阻塞。网络中
IO
阻塞如下图所示:
(
2
)我女友不甘心白白在这等,又想去逛商场,又担心饭好了。所以我们逛一会,回来询问服务员饭好了没有,来来回回好多次,饭都还没吃都快累死了啦。这就是非阻塞。需要不断的询问,是否准备好了。网络
IO
非阻塞如下图所示:
(
3
)与第二个方案差不多,餐厅安装了电子屏幕用来显示点餐的状态,这样我和女友逛街一会,回来就不用去询问服务员了,直接看电子屏幕就可以了。这样每个人的餐是否好了,都直接看电子屏幕就可以了,这就是典型的
IO
多路复用,如
select
、
poll
、
epoll
。网络
IO
具体模型如下图所示:
(这句是下面的评论给出的解释,这个说的合理(3)中女友比喻不够形象合理啊!多路复用应该是:你有多个女友都要在那里吃饭,然后你苦逼的在餐厅等着不断询问几个女友的饭是否有好了的,这时你的女友们就可以出去继续逛街,然后你一但发现某个女友的饭好了就打电话通知该女友来吃饭!)
(
4
)女友不想逛街,又餐厅太吵了,回家好好休息一下。于是我们叫外卖,打个电话点餐,然后我和女友可以在家好好休息一下,饭好了送货员送到家里来。这就是典型的异步,只需要打个电话说一下,然后可以做自己的事情,饭好了就送来了。
linux
提供了
AIO
库函数实现异步,但是用的很少。目前有很多开源的异步
IO
库,例如
libevent
、
libev
、
libuv
。异步过程如下图所示:
4
、同步与异步
实际上同步与异步是针对应用程序与内核的交互而言的。同步过程中进程触发
IO
操作并等待或者轮询的去查看
IO
操作是否完成。异步过程中进程触发
IO
操作以后,直接返回,做自己的事情,
IO
交给内核来处理,完成后内核通知进程
IO
完成。同步与异步如下图所示:
5
、阻塞与非阻塞
简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。详细区别如下图所示:
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0