原文地址:https://blog.51cto.com/luminous/1832114

I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。select,poll,epoll都是IO多路复用的机制。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。下来,分别谈谈。

select——>

原理概述:

select 的核心功能是调用tcp文件系统的poll函数,不停的查询,如果没有想要的数据,主动执行一次调度(防止一直占用cpu),直到有一个连接有想要的消息为止。从这里可以看出select的执行方式基本就是不同的调用poll,直到有需要的消息为止。
缺点:

1、每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大;

2、同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大;

3、select支持的文件描述符数量太小了,默认是1024。

优点:

1、select的可移植性更好,在某些Unix系统上不支持poll()。

2、select对于超时值提供了更好的精度:微秒,而poll是毫秒。

poll——>

原理概述:

poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。

缺点:

1、大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义;

2、与select一样,poll返回后,需要轮询pollfd来获取就绪的描述符。

优点:

1、poll() 不要求开发者计算最大文件描述符加一的大小。

2、poll() 在应付大数目的文件描述符的时候速度更快,相比于select。

3、它没有最大连接数的限制,原因是它是基于链表来存储的。

epoll——>

原理概述:

epoll同样只告知那些就绪的文件描述符,而且当我们调用epoll_wait()获得就绪文件描述符时, 返回的不是实际的描述符,而是一个代表就绪描述符数量的值,你只需要去epoll指定的一 个数组中依次取得相应数量的文件描述符即可,这里也使用了内存映射技术,这 样便彻底省掉了这些文件描述符在系统调用时复制的开销。

epoll的优点就是改进了前面所说缺点:

1、支持一个进程打开大数目的socket描述符:相比select,epoll则没有对FD的限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左右,具体数目可以cat /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大。

2、IO效率不随FD数目增加而线性下降:epoll不存在这个问题,它只会对"活跃"的socket进行操作— 这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用 callback函数,其他idle状态socket则不会,在这点上,epoll实现了一个"伪"AIO,因为这时候推动力在os内核。在一些 benchmark中,如果所有的socket基本上都是活跃的—比如一个高速LAN环境,epoll并不比select/poll有什么效率,相 反,如果过多使用epoll_ctl,效率相比还有稍微的下降。但是一旦使用idle connections模拟WAN环境,epoll的效率就远在select/poll之上了。

3、使用mmap加速内核与用户空间的消息传递:这点实际上涉及到epoll的具体实现了。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就 很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。

三者对比与区别:

1、select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。

2、select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。

细说select、poll和epoll之间的区别与优缺点相关推荐

  1. (转)select、poll、epoll之间的区别

    本文来自:https://www.cnblogs.com/aspirant/p/9166944.html (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道 ...

  2. select、poll、epoll之间的区别

    select.poll.epoll之间的区别(搜狗面试) - aspirant - 博客园 (cnblogs.com)

  3. select、poll、epoll之间的区别(搜狗面试)

    (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对 ...

  4. IO多路复用中select、poll、epoll之间的区别

    本文来说下IO多路复用中select.poll.epoll之间的区别 文章目录 什么是IO多路复用 为什么有IO多路复用机制 同步阻塞(BIO) 同步非阻塞(NIO) IO多路复用(现在的做法) 3种 ...

  5. html select选择事件_一道搜狗面试题:IO多路复用中select、poll、epoll之间的区别...

    (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对 ...

  6. select、poll、epoll之间的区别(搜狗面试题)

    (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对 ...

  7. select、poll、epoll之间的区别总结[整理]

    select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select ...

  8. select、poll、epoll之间的区别总结摘自http://www.cnblogs.com/Anker/p/3265058.html

    select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select ...

  9. select、poll、epoll之间的区别总结[整理] + 知乎大神解答

    转自;http://www.cnblogs.com/Anker/p/3265058.html 阅读: https://mp.weixin.qq.com/s?__biz=Mzg3MjA4MTExMw== ...

最新文章

  1. 干货丨2017年含金量最高的机器学习技能或知识有哪些?
  2. struts2 理解
  3. 安装angular cli_Angular 9适用于初学者—如何使用Angular CLI安装第一个应用程序
  4. 手机modem开发(15)---FT 测试天线注意事项
  5. Mysql学习总结(67)——MYSQL慢查询日志
  6. Bouncy Castle Crypto API c# port
  7. [转载] Python3 * 和 ** 运算符
  8. Mysql5.7及以上版本的MySQL下载、安装及配置教程(附图)
  9. css3技巧——产品列表之鼠标滑过效果(一)
  10. 下载和安装R、RStudio !~~~
  11. 从达尔文到DevOps:John Willis和Gene Kim谈后凤凰项目时代
  12. 计算机键盘基础知识课件,高中信息技术计算机基础应用课件:键盘操作练习
  13. 【软件工程师学硬件】之 接口
  14. 计算机内存改成多少合适,32g内存需要设置虚拟内存吗?32g内存虚拟内存设置多少合适...
  15. mysql脏页处理方法_mysql刷脏页的一次总结
  16. box-shadow页面立体效果
  17. c#汉字转拼音(GBK,GB2312)
  18. 小程序pdf预览、分享、自定义标题
  19. OpenCV手掌识别
  20. # unity shader 后期轮廓(更新中)

热门文章

  1. WIN10环境下 CCS6.0+SEED-DTK6437 实验
  2. 通过packstack快速安装openstack
  3. python最全邮件收发pop3与smtp
  4. UnityShader基础(五)——进阶纹理
  5. 多多进宝商品列表接口,商品销量,店铺昵称,sku价格,sku属性,商品运费等接口代码展示
  6. python中的相关性和协方差(调用Yahoo的金融数据)
  7. 常用的Migrations指令
  8. ABT 节点安装使用 Blocklet 指南 | ArcBlock 博客
  9. WebRTC基础实践 - 9. 拍照并传给对方
  10. 给DreamweaverCs6安装Emmet插件,让你快速编写html标签