【本文转载于再谈select, iocp, epoll,kqueue及各种I/O复用机制】

首先,介绍几种常见的I/O模型及其区别,如下:

  • blocking I/O

  • nonblocking I/O

  • I/O multiplexing (select and poll)

  • signal driven I/O (SIGIO)

  • asynchronous I/O (the POSIX aio_functions)

blocking I/O 
这个不用多解释吧,阻塞套接字。下图是它调用过程的图示:

重点解释下上图,下面例子都会讲到。首先application调用 recvfrom()转入kernel,注意kernel有2个过程,wait for data和copy data from kernel to user。直到最后copy complete后,recvfrom()才返回。此过程一直是阻塞的。

nonblocking I/O: 
与blocking I/O对立的,非阻塞套接字,调用过程图如下:

可以看见,如果直接操作它,那就是个轮询。。直到内核缓冲区有数据。

I/O multiplexing (select and poll) 
最常见的I/O复用模型,select。

select先阻塞,有活动套接字才返回。与blocking I/O相比,select会有两次系统调用,但是select能处理多个套接字。

signal driven I/O (SIGIO) 
只有UNIX系统支持,感兴趣的课查阅相关资料

I/O multiplexing (select and poll)相比,它的优势是,免去了select的阻塞与轮询,当有活跃套接字时,由注册的handler处理。

asynchronous I/O (the POSIX aio_functions) 
很少有*nix系统支持,windows的IOCP则是此模型

完全异步的I/O复用机制,因为纵观上面其它四种模型,至少都会在由kernel copy data to appliction时阻塞。而该模型是当copy完成后才通知application,可见是纯异步的。好像只有windows的完成端口是这个模型,效率也很出色。

下面是以上五种模型的比较

可以看出,越往后,阻塞越少,理论上效率也是最优。

=====================分割线==================================

5种模型的比较比较清晰了,剩下的就是把select,epoll,iocp,kqueue按号入座那就OK了。

select和iocp分别对应第3种与第5种模型,那么epoll与kqueue呢?其实也于select属于同一种模型,只是更高级一些,可以看作有了第4种模型的某些特性,如callback机制。

那么,为什么epoll,kqueue比select高级? 

答案是,他们无轮询。因为他们用callback取代了。想想看,当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询,这正是epoll与kqueue做的。

windows or *nix (IOCP or kqueue/epoll)?

诚然,Windows的IOCP非常出色,目前很少有支持asynchronous I/O的系统,但是由于其系统本身的局限性,大型服务器还是在UNIX下。而且正如上面所述,kqueue/epoll 与 IOCP相比,就是多了一层从内核copy数据到应用层的阻塞,从而不能算作asynchronous I/O类。但是,这层小小的阻塞无足轻重,kqueue与epoll已经做得很优秀了。

提供一致的接口,IO Design Patterns

实际上,不管是哪种模型,都可以抽象一层出来,提供一致的接口,广为人知的有ACE,Libevent这些,他们都是跨平台的,而且他们自动选择最优的I/O复用机制,用户只需调用接口即可。说到这里又得说说2个设计模式,Reactor and Proactor。有一篇经典文章http://www.artima.com/articles/io_design_patterns.html值得阅读,Libevent是Reactor模型,ACE提供Proactor模型。实际都是对各种I/O复用机制的封装。

Java nio包是什么I/O机制?

我曾天真的认为java nio封装的是IOCP。。现在可以确定,目前的java本质是select()模型,可以检查/jre/bin/nio.dll得知(笔者注:jdk6.0 在linux下是epoll、在win下是select)。至于java服务器为什么效率还不错。。我也不得而知,可能是设计得比较好吧。。-_-。

=====================分割线==================================

总结一些重点:

  1. 只有IOCP是asynchronous I/O,其他机制或多或少都会有一点阻塞。
  2. select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善
  3. epoll, kqueue是Reacor模式,IOCP是Proactor模式。
  4. java nio包:jdk6.0 在linux下是epoll、在win下是select

简单谈谈select, iocp, epoll,kqueue及各种I/O复用机制相关推荐

  1. 再谈select, iocp, epoll,kqueue及各种I/O复用机制 - Shallway - 博客频道 - CSDN.NET

    再谈select, iocp, epoll,kqueue及各种I/O复用机制 - Shallway - 博客频道 - CSDN.NET 再谈select, iocp, epoll,kqueue及各种I ...

  2. epoll编程实例客户端_深入底层探析网络编程之多路复用器(select,poll,epoll)

    IO模型 只关注IO,不关注IO读写完成后的事情. 同步:程序(APP)自己进行读/写操作 异步:由Kernel完成读/写,程序跑起来感觉像没有访问IO,访问的是buffer 阻塞:BLOCKING, ...

  3. select,poll,epoll的归纳总结区分

     Select.Poll与Epoll比较 以下资料都是来自网上搜集整理.引用源详见文章末尾. 1 Select.Poll与Epoll简介 Select select本质上是通过设置或者检查存放fd ...

  4. IO多路复用select,poll epoll以及区别

    看这个一次读懂 Select.Poll.Epoll IO复用技术 文章来简单理解下,如果不是很明白的话,可以参考下面转的知乎上面白话文列子 作者:Leslie 链接:https://www.zhihu ...

  5. C++面试 select poll epoll之间的区别

    目录 摘要 场景描述 Select poll epoll 总结 摘要 先明确几个概念: 面试官问:给我讲讲什么事同步阻塞.异步阻塞.同步非阻塞.异步非阻塞. 我:????? 同步和异步的概念 同步是指 ...

  6. Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)

    一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 1 简单的启动线程语法 2 def run(na ...

  7. 【转帖】Nginx优化use参数epoll,kqueue,rtsig,eventport,poll

    下图对比了poll select epoll和kqueue的性能.select和poll是一个级别的,epoll和kqueue是一个级别的,相差不多.epoll用在linux上,kqueue用在bsd ...

  8. select 和epoll模型区别

    1.select 和epoll模型区别 1.1.网络IO模型概述 通常来说,网络IO可以抽象成用户态和内核态之间的数据交换.一次网络数据读取操作(read),可以拆分成两个步骤:1)网卡驱动等待数据准 ...

  9. socket 编程篇六之IPO多路复用-select poll epoll

    http://blog.csdn.net/woxiaohahaa/article/details/51498951 文章参考自:http://blog.csdn.net/tennysonsky/art ...

最新文章

  1. MVC5 + EF6 入门完整教程
  2. 长语音识别体验_如何为语音体验写作
  3. 2014.9.13模拟赛【数位和乘积】
  4. Using Java SecurityManager to grant/deny access to system functions
  5. 使用libcurl编写HTTP客户端的方法
  6. 32位汇编第五讲,逆向实战干货,(OD)快速定位扫雷内存.
  7. 联想g510升级换什么cpu好_联想G510笔记本完全拆机指南(图解)
  8. 如何开启win10自带的五笔输入法,并把字库切换成五笔98版
  9. mtk 6577 root
  10. MongoDB在Windows10上的安装配置和基本语句
  11. python中rect用法_【opencv基础】Rect类的神奇用法
  12. erp 计算机语言,erp开发用什么语言
  13. 大学开设大数据专业,都安排了哪些课程?
  14. 使用线性SVM实现对垃圾邮件分类
  15. [机器学习]随机森林源码(python)
  16. nmon结果分析工具_使用nmon analyzer 分析指标
  17. 小米路由器R4AC 小米路由器4A百兆版 原厂BootLoader和eeprom
  18. Cocos2D开发的iPhone游戏的教程
  19. matlab中的measure,关于matlab中awgn函数中参数作用的测试
  20. 【运动学】基于matlab GUI三体运动模拟【含Matlab源码 871期】

热门文章

  1. mysql数据导入导出 CSV格式_MySQL中导入导出CSV格式数据
  2. csgo跳投指令_csgo跳投绑定指令
  3. mysql 密码文件改成密文_数据库密码弄成密文
  4. java vim ide_把VIM配置成IDE开发环境 | 学步园
  5. 5g信号频率是多少赫兹_5G的网速为什么那么快?这得从一个简单的公式说起
  6. Python编程基础17:构造方法和析构方法
  7. 安卓学习笔记11:常用布局 - 网格布局
  8. PHP案例:实现登录功能
  9. 【codevs1226】倒水问题,BFS练习
  10. Must 和 have to的疑问句_55 1