网络IO之阻塞、非阻塞、同步、异步总结

一、前言linux

  在网络编程中,阻塞、非阻塞、同步、异步常常被提到。unix网络编程第一卷第六章专门讨论五种不一样的IO模型,Stevens讲的很是详细,我记得去年看第一遍时候,似懂非懂,没有深刻理解。网上有详细的分析:http://blog.csdn.net/historyasamirror/article/details/5778378。我结合网上博客和书总结一下,加以区别,加深理解。编程

二、数据流向网络

  网络IO操做实际过程涉及到内核和调用这个IO操做的进程。以read为例,read的具体操做分为如下两个部分:异步

  (1)内核等待数据可读async

  (2)将内核读到的数据拷贝到进程函数

详细过程以下图所示:spa

三、网络IO模型详细分析.net

  常见的IO模型有阻塞、非阻塞、IO多路复用,异步。以一个生动形象的例子来讲明这四个概念。周末我和女朋友去逛街,中午饿了,咱们准备去吃饭。周末人多,吃饭须要排队,我和女朋友有如下几种方案:3d

  (1)我和女朋友点完餐后,不知道何时能作好,只好坐在餐厅里面等,直到作好,而后吃完才离开。unix

女朋友本想还和我一块儿逛街的,可是不知道饭能何时作好,只好和我一块儿在餐厅等,而不能去逛街,直到吃完饭才能去逛街,中间等待作饭的时间浪费掉了。这就是典型的阻塞。网络中IO阻塞以下图所示:

  (2)我女朋友不甘心白白在这等,又想去逛商场,又担忧饭好了。因此咱们逛一会,回来询问服务员饭好了没有,来来回回好屡次,饭都还没吃都快累死了啦。这就是非阻塞。须要不断的询问,是否准备好了。网络IO非阻塞以下图所示:

  (3)与第二个方案差很少,餐厅安装了电子屏幕用来显示点餐的状态,这样我和女朋友逛街一会,回来就不用去询问服务员了,直接看电子屏幕就能够了。这样每一个人的餐是否好了,都直接看电子屏幕就能够了,这就是典型的IO多路复用,如select、poll、epoll。网络IO具体模型以下图所示:

  (4)女朋友不想逛街,又餐厅太吵了,回家好好休息一下。因而咱们叫外卖,打个电话点餐,而后我和女朋友能够在家好好休息一下,饭好了送货员送到家里来。这就是典型的异步,只须要打个电话说一下,而后能够作本身的事情,饭好了就送来了。linux提供了AIO库函数实现异步,可是用的不多。目前有不少开源的异步IO库,例如libevent、libev、libuv。异步过程以下图所示:

四、同步与异步

  实际上同步与异步是针对应用程序与内核的交互而言的。同步过程当中进程触发IO操做并等待或者轮询的去查看IO操做是否完成。异步过程当中进程触发IO操做之后,直接返回,作本身的事情,IO交给内核来处理,完成后内核通知进程IO完成。同步与异步以下图所示:

五、阻塞与非阻塞

  简单理解为须要作一件事能不能当即获得返回应答,若是不能当即得到返回,须要等待,那就阻塞了,不然就能够理解为非阻塞。详细区别以下图所示:

 

参考资料:

http://www.open-open.com/doc/view/cbb2c3363c3b49ceb5812220a9c42e42

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

http://www.zhihu.com/question/19732473

http://www.ibm.com/developerworks/cn/linux/l-async/