博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
select,poll,epoll三者的差别
阅读量:5109 次
发布时间:2019-06-13

本文共 1221 字,大约阅读时间需要 4 分钟。

先对比一下select和poll

(1)poll不要求开发者在计算最大文件描述符时进行+1的操作

(2)poll在应付大数目的文件描述符的时候速度更快,因为对于select来说内核需要检查大量描述符对应的fd_set中的每一个比特位

(3)select可以监控的文件描述数目是固定的,相对来说较少(1024/2048)。

如果需要监控数值比较大的文件描述符,或者是分布的很稀疏的较少的描述符,效率也会很低。

而对于poll函数来说,就可以创建特定大小的数组来保存监控的描述符,而不受文件描述符值大小的影响,而且poll可以监控的文件数目大于select

(4)对于select来说,所监控的fd_set在select返回之后会发生变化, 所以在下一次进入select之前都需要初始化需要监控的fd_set

poll函数将监控的输入和输出时间分开,允许被监控的文件数组被复用而不需要重新初始化

 

select的优点如下

(1)select的可移植性好,在某些UNIX系统上不支持Poll

(2)slect对于超时值提供了更好的精度,而poll的精度较差

 

epoll优点如下:

(1)支持一个进程打开大数目的socket描述符

select最不能忍受的是一个进程所打开的FD友一定的限制,因为FD_SETSIZE的默认值为1024/2048

对于那些需要支持上完链接数目的IM服务器来说显然太笑了,这时候可以选择修改这个宏然后重新编译内核

不过epoll没有这个限制,它所支持的FD上限是最大可以打开的数目,这个数字远大于2048。比如在1GB内存的空间中这个数字为10WW

 

(2)IO效率不随FD数组增加而线性下降

select和poll都有一个致命的弱点就是因为网络延迟的问题,大量的socket在这这时候只会有一小部分是活跃的,然而select和poll

每次调用都会线性扫描全部的集合,这时候就导致效率的下降。但是epoll不存在这个其问题,它只会对活跃的socket进行操作

则是因为在内核中实现epoll是根据每个fd上面的callback函数实现的。name只有活跃的socket才会主动调用callback

其他处于idle形态的socket则不会

 

(3)使用mmap加速内核与用户空间的消息传递

无论是epoll还是select、poll都需要内核将fd信息通知给用户空间,如何避免不必要的内存拷贝就显得尤为重要

epoll是通过内核与用户空间的mmap处于同一内存空间实现的

对于poll来说用户传入pollfd数组拷贝到内和空间,因为拷贝操作和数组长度,时间上看这是O(n)操作

当事件发生后,poll将获得的数据传送到用户空间。并执行释放内存和剥离等待队列等工作,向用户空间拷贝数据

与剥离等待队列等操作的世界都时候O(n)

 

转载于:https://www.cnblogs.com/tijie/p/10580707.html

你可能感兴趣的文章
获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName...
查看>>
证件照(1寸2寸)拍摄处理知识汇总
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
Python入门-函数
查看>>
[HDU5727]Necklace(二分图最大匹配,枚举)
查看>>
距离公式汇总以及Python实现
查看>>
设计模式之装饰者模式
查看>>
一道不知道哪里来的容斥题
查看>>
Blender Python UV 学习
查看>>
window添加右键菜单
查看>>
入手腾龙SP AF90mm MACRO
查看>>
Window7上搭建symfony开发环境(PEAR)
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
一些方便系统诊断的bash函数
查看>>
jquery中ajax返回值无法传递到上层函数
查看>>
css3之transform-origin
查看>>
[转]JavaScript快速检测浏览器对CSS3特性的支持
查看>>