Select、Poll与Epoll比较

以下资料都是来自网上搜集整理。引用源详见文章末尾。

1 Select、Poll与Epoll简介

Select

select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是:

1 单个进程可监视的fd数量被限制

2 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大

3 对socket进行扫描时是线性扫描

Poll

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

它没有最大连接数的限制,原因是它是基于链表来存储的,但是同样有一个缺点:大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。

poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。

Epoll

epoll支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次。

在前面说到的复制问题上,epoll使用mmap减少复制开销。

还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知

注:水平触发(level-triggered)——只要满足条件,就触发一个事件(只要有数据没有被获取,内核就不断通知你);边缘触发(edge-triggered)——每当状态变化时,触发一个事件。

2 Select、Poll与Epoll区别

Select

Poll

Epoll

支持最大连接数

1024(x86) or 2048(x64)

无上限

无上限

IO效率

每次调用进行线性遍历,时间复杂度为O(N)

每次调用进行线性遍历,时间复杂度为O(N)

使用“事件”通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪fd放到rdllist里面,这样epoll_wait返回的时候我们就拿到了就绪的fd。时间发复杂度O(1)

fd拷贝

每次select都拷贝

每次poll都拷贝

调用epoll_ctl时拷贝进内核并由内核保存,之后每次epoll_wait不拷贝

3 性能比较

由于博主并没有提供测试的机器参数,以及测试程序代码,所以这个性能测试只能够算是一个补充吧,对于epoll在大量fd情况下优势的直观展示。

表格左侧是描述符集合的大小,右侧分别表示1s对poll和epoll的调用次数,也就是性能瓶颈。

从上表可以看出当fd数量较少的时候poll略优于epoll,但是当fd增大到某个阈值时,poll性能急剧下降。而epoll始终保持的稳定的性能。

4 使用

当同事需要保持很多的长连接,而且连接的开关很频繁时,就能够发挥epoll最大的优势了。这里与服务器模型其实已经有些交集了。

同时需要保持很多的长连接,而且连接的开关很频繁,最高效的模型是非阻塞、异步IO模型。而且不要用select/poll,这两个API的有着O(N)的时间复杂度。在Linux用epoll,BSD用kqueue,Windows用IOCP,或者用libevent封装的统一接口(对于不同平台libevent实现时采用各个平台特有的API),这些平台特有的API时间复杂度为O(1)。 然而在非阻塞,异步I/O模型下的编程是非常痛苦的。由于I/O操作不再阻塞,报文的解析需要小心翼翼,并且需要亲自管理维护每个链接的状态。并且为了充分利用CPU,还应结合线程池,避免在轮询线程中处理业务逻辑。

但这种模型的效率是极高的。以知名的http服务器nginx为例,可以轻松应付上千万的空连接+少量活动链接,每个连接连接仅需要几K的内核缓冲区,想要应付更多的空连接,只需简单的增加内存(数据来源为淘宝一位工程师的一次技术讲座,并未实测)。这使得DDoS攻击者的成本大大增加,这种模型攻击者只能将服务器的带宽全部占用,才能达到目的,而两方的投入是不成比例的。

注:长连接——连接后始终不断开,然后进行报文发送和接受;短链接——每一次通讯都建立连接,通讯完成即断开连接,下次通讯再建立连接。

select,poll,epoll的归纳总结区分相关推荐

  1. 彻底搞懂 select/poll/epoll,就这篇了!

    之前已经把网络 I/O 相关要点都盘了,还剩 select/poll/epoll 这几个区别没说,这篇就来搞搞它们,并且是从完全理解原理的角度来区分它们. 本来是要上源码的,但是感觉没啥必要,身为应用 ...

  2. select poll epoll 高效IO 多路转接

    目录 五种常见IO模型 高效IO的概念 阻塞 vs 非阻塞 非阻塞IO fcntl函数 I/O多路转接之select 初识select select函数原型 select操作接口 tcp_server ...

  3. java nio原理 epoll_多路复用 Select Poll Epoll 的实现原理(BIO与NIO)

    BIO blocking阻塞的意思,当我们在后端开发使用的时候,accetp 事件会阻塞主线程. 当accept事件执行的时候,客户的会和服务建立一个socket 连接.一般后端就会开启一个线程执行后 ...

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

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

  5. python3 异步 非阻塞 IO多路复用 select poll epoll 使用

    有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的. 下面记录下分别基于Select/Poll/Epoll的echo ser ...

  6. select,poll,epoll区别面试常问

    select,poll,epoll区别: select优点 1)select()的可移植性更好,在某些Unix系统上不支持poll() 2)select() 对于超时值提供了更好的精度:微秒,而pol ...

  7. IO模型(select, poll, epoll的区别和原理)

    参考<unix网络编程> 参考http://blog.csdn.net/blueboy2000/article/details/4485874 参考http://blog.csdn.net ...

  8. select/poll/epoll 与 /dev/poll

    select/poll 这两种实际上差不多,都是把一组fd传送给kernal,然后返回一个就绪fd的数量,然后开始遍历所有的fd,找到那些可读或者可写的. 区别在于,poll相比select来说,传送 ...

  9. select poll epoll IO操作多路复用及猴子补丁

    一:select(能监控数量有限,不能告诉用户程序具体那个连接有数据) select目前几乎所有的平台都支持,其良好的跨平台支持也是一个优点 select的缺点在于单个进程能够监控的文件描述的数量存在 ...

最新文章

  1. windows下mongodb配置
  2. 使用 iptables 限制***猜密码续—深入 recent 模块
  3. JSP的四个作用域(转载)
  4. gitlable iphone_iPhone 12首批用户成“小白鼠”,“信号故障”躺枪者无数
  5. FreeNAS 是什么
  6. HDU 2389(HK 最大二分匹配)
  7. a股历史30年的大盘价_上交所成立30周年!6张图读懂A股30年
  8. 网络安全工程考试大纲
  9. php 覆盖静态方法吗,覆盖PHP中的静态方法
  10. HTML+CSS 制作下拉菜单
  11. 总结在CentOS7上搭建CUDA10+cudnn7的Tensorflow-gpu环境的经验
  12. html和flash播放器区别,flash播放器和一般播放器有什么区别
  13. Python学习总结(1)——Python知识清单(基础知识数据科学)
  14. 人工解决问题和用计算机解决问题的相同点,第2学时:计算机解决问题的过程_20120207110033703.doc...
  15. 武音硕士研究生《计算机音乐作曲》培训,武汉音乐学院2013年硕士研究生招生计算机音乐作曲科目考试大纲及参考书目...
  16. 阿里云上海云栖大会上宣布多款核心云计算产品降价 最高降幅达50%
  17. 通俗易懂的函数指针及函数指针数组
  18. 超级码力在线编程大赛初赛第1场-1-树木规划题解
  19. 手动修改Spyder的背景颜色(手动配色)
  20. 元旦抽空修了一下自己家的优步YB-530多功能家用静音跑步机

热门文章

  1. Nature:将基因测序带到前所未有的精度,人类首次具有在任何组织中研究基因突变的能力
  2. P53:进化了8亿年的抑癌基因
  3. 让你的Mac读给你听,还能听写,用来练习英语口语!
  4. 华农专业课计算机基础,华南农业大学期末考试大学计算机基础试卷.doc
  5. generating phar.php,Generating
  6. 信奥中的数学:孙子定理 中国剩余定理
  7. 语言编写正反星星_厉害!浙理工师生原创短片《星星》入围5个国际电影节
  8. java semaphorewa_Java并发(十五):并发工具类——信号量Semaphore
  9. MySQL笔记-查询进程列表(查客户端IP、使用的用户、当前状态、ID号、使用的库)及断开客户端连接
  10. Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图