1、前言

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

2、数据流向

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

  (1)内核等待数据可读

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

详细过程如下图所示:

3、网络IO模型详细分析

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

  (1)我和女友点完餐后,不知道什么时候能做好,只好坐在餐厅里面等,直到做好,然后吃完才离开。

女友本想还和我一起逛街的,但是不知道饭能什么时候做好,只好和我一起在餐厅等,而不能去逛街,直到吃完饭才能去逛街,中间等待做饭的时间浪费掉了。这就是典型的阻塞。网络中IO阻塞如下图所示:

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

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

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

4、同步与异步

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

5、阻塞与非阻塞

  简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞。详细区别如下图所示:

转自http://www.cnblogs.com/Anker/p/3254269.html

最新文章

  1. POI导入导出
  2. iOS多线程的详情使用示例--简进祥
  3. Webservice加上SoapHeader验证方式
  4. xdebug
  5. 命令行中使用adb安装apk
  6. [DevExpress]ChartControl之基准线示例
  7. xsd转实体类
  8. 安装帝国CMS遇到“修改php.ini,将:short_open_tag 设为 On”的解决方法+“建立目录不成功!请检查目录权限”问题
  9. 使用Runtime.getRuntime().exec()方法的几个陷阱 (转)
  10. HDFS中NameNode启动过程
  11. EasyUI扩展验证
  12. day-4 python多进程编程知识点汇总
  13. Dijkstra的双栈算术表达式求值算法
  14. PTA 社交网络图中结点的“重要性”计算(30 分)
  15. SQL Server 更新统计信息出现严重错误,应放弃任何可能产生的结果
  16. urllib、urllib2、urllib3区别和使用
  17. 《DSP using MATLAB》Problem 5.30
  18. CyclicBarrier簡介
  19. dbcp和druid(数据库连接池)
  20. Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'系列三:重置主从同步

热门文章

  1. 安卓https
  2. ZOJ Problem Set - 3822Domination(DP)
  3. python调用Java代码,完毕JBPM工作流application
  4. 62.nodejs中的ejs模板学习
  5. 洛谷P2251 质量检测
  6. System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接
  7. javafx KeyFrame
  8. CF 843 A. Sorting by Subsequences
  9. errpt命令
  10. 2017国家集训队作业[agc016e]Poor Turkey