select: 轮询+fd_set

1.采用fd_set存储fd(fd_set通过数组位图实现)

2.每次调用select,都需要把fd集合从用户态拷贝到内核态,fd越多开销越大

3.每次调用select,都需要在内核遍历传递进来的fd,开销大(轮询)

4.select支持的fd数量太少,1024(32个32位的整数,也就是2的10次方),受fd_setsize参数限制,改变这个参数的话需要重新编译内核

具体想要突破fd_setsize参数限制的话有以下2个方法:

1)修改sys/types.h头文件中的fd_setsize值并且重新编译内核,当然这并不是一个好的方法,fd_setsize的值变大意味着我们轮询一次的时间需要加长

2)通过多核CPU,采用分而治之+负载均衡的思想将连接注册在多个select上,并发select不仅能突破fd_setsize限制而且能提高性能,有点map -reduce的思想,这里还有一个问题,就是当一个轮询器poller上的最大轮询数量超过了1024还能不能注册的问题,我们同样可以采用分而治之的多线程轮询策略来解决,比如连接数2000,线程1轮询0到1023,线程2轮询1024-2000

5.调用select,返回的是含有整个句柄的数组,需要遍历整个数组才知道哪些句柄发生了事件(轮询)

6.select的触发是LT模式,效率不高

poll:轮询+链表

1.采用链表存储fd,没有了fd数量限制,但是上述其他缺点依然存在

epoll:红黑树+双链表+回调机制

1.红黑树挂载事件,事件发生时通过回调机制将事件添加到双链表中

2.检查是否有事件发生时,不需要轮询,只需要检查双链表即可

3.保证每个fd只会被拷贝一次(事件被加入到epoll中时,fd就会被拷贝进入内核,而不是在epoll_wait时拷贝),使用了mmap加速内核与用户空间的消息传递,无论是select还是poll都需要内核把fd消息通知给用户空间,如何1避免不必要的内存拷贝就很重要,在这点上,epoll通过内核与用户空间mmap同一块内存实现!

4.fd数量上限为最大可以打开的文件数目,这个我们可以通过调整内核的参数来改变,通过ulimit -n来调整或者setrlimit函数设置,当然这个需要root权限,但是一个系统能打开的文件最大数目也是有限制的,取决于内存大小,可以通过cat/proc/sys/fs/file-max查看

该双链表我们一般叫做就绪事件链表

当然,以上的优缺点仅仅是在高并发且任一时间只有少数socket活跃的特定场景下的,如果并发量高,socket都比较活跃的情况下,select就不见得会比epoll慢(就像我们常常是快排比插入排序快,但是在特定的情况下并不成立)

什么情况下使用select,poll的性能好于使用epoll?

高并发,少活跃socket的情况下,select的轮询在于每次轮询都会轮询到不活跃的套接字,从而浪费了时间导致效率慢

但是当高并发,多活跃socket的情况下,select的轮询每次都能很快的轮询到活跃的套接字,这种情况下也是可以考虑使用select的!

最后,总结一下

并发低   socket活跃   select/poll

并发低   socket不活跃 select/poll

这两种情况使用epoll[红黑树+链表+回调机制]有点杀鸡用牛刀的感觉

并发高   socket活跃       select/poll的性能不一定比epoll差

并发高   socket不活跃     epoll

//先码着,后面准备自己实现一下这三种机制

关于epoll,select,poll的理解的更多相关文章

  1. 关于同步,异步,阻塞,非阻塞,IOCP/epoll,select/poll,AIO ,NIO ,BIO的总结

    相关资料 IO基本概念 Linux环境 同步异步阻塞非阻塞 同步与异步 阻塞与非阻塞 IO模型Reference Link 阻塞IO模型 非阻塞IO模型 IO复用模型 信号驱动异步IO模型 异步IO模 ...

  2. [转载] Linux下多路复用IO接口 epoll select poll 的区别

    原地址:http://bbs.linuxpk.com/thread-43628-1-1.html 废话不多说,一下是本人学习nginx 的时候总结的一些资料,比较乱,但看完后细细揣摩一下应该就弄明白区 ...

  3. Linux下多路复用IO接口epoll/select/poll的区别

    select比epoll效率差的原因:select是轮询,epoll是触发式的,所以效率高. Select: 1.Socket数量限制:该模式可操作的Socket数由FD_SETSIZE决定,内核默认 ...

  4. 多进程、协程、事件驱动及select poll epoll

    目录 -多线程使用场景 -多进程 --简单的一个多进程例子 --进程间数据的交互实现方法 ---通过Queues和Pipe可以实现进程间数据的传递,但是不能实现数据的共享 ---Queues ---P ...

  5. 转--select/poll/epoll到底是什么一回事

    面试题:说说select/poll/epoll的区别. 这是面试后台开发时的高频面试题,属于网络编程和IO那一块的知识.Android里面的Handler消息处理机制的底层实现就用到了epoll. 为 ...

  6. 最快理解 - IO多路复用:select / poll / epoll 的区别.

    目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...

  7. 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

    下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

  8. [转] Epoll 相对Poll和Select的优点

    http://blog.csdn.net/summerhust/article/details/18260117 PS: 相对select来说,Poll的监听列表比select更短,并且Poll的监听 ...

  9. select, poll, epoll的实现分析

    select, poll, epoll都是Linux上的IO多路复用机制.知其然知其所以然,为了更好地理解其底层实现,这几天我阅读了这三个系统调用的源码. 以下源代码摘自Linux4.4.0内核. 预 ...

随机推荐

  1. Java IO管道流

    import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; publi ...

  2. MyBatis项目配置案例详解与Web下的增删改查实现[附项目源码]

    MyBatis项目案例 项目图示: 项目源码地址:https://github.com/JluTiger/mybatispro 1.项目功能 项目案例:后台管理系统用户数据维护平台 所有用户数据查询 ...

  3. RNN梯度消失和爆炸的原因 以及 LSTM如何解决梯度消失问题

    RNN梯度消失和爆炸的原因 经典的RNN结构如下图所示: 假设我们的时间序列只有三段,  为给定值,神经元没有激活函数,则RNN最简单的前向传播过程如下: 假设在t=3时刻,损失函数为  . 则对于一 ...

  4. python定制后处理云图

    用后处理软件处理的云图会出现这样或那样的不满意,其实我们可以将求解数据导出以后,借助python定制云图. 我们以fluent为例 求解完成之后,我们将我们需要做云图的物理量以ASCII导出 如下的p ...

  5. DDD应对运营活动系统腐化实践

    前言 任何人类的设计都会腐化,软件系统也不例外 腐化之谜 随着系统的规模增长和复杂度膨胀,系统会慢慢腐化. 于是改一个很简单的下单地址,就会牵动整个交易系统十几处的改动. 如何解决这种腐化之谜呢? 参 ...

  6. U盘量产过程PS2251-07(PS2307) - F/W 01.05.10 [2014-05-23]

    说明本篇文章可能无法解决你的问题,请谨慎尝试.本博客中使用的工具提供下载(如果没有积分,可联系作者免费获取)ChipGenius_v4_00_0030UPTool_v2.089起因 U盘原先正常使用, ...

  7. org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application

    编程中遇到:org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot ...

  8. flutter 页面布局 Paddiing Row Column Expanded 组件

    Flutter Paddiing 组件 在 html 中常见的布局标签都有 padding 属性,但是 Flutter 中很多 Widget 是没有 padding 属 性.这个时候我们可以用 Pad ...

  9. typeScript中的数据类型

    /* typeScript中的数据类型 typescript中为了使编写的代码更规范,更有利于维护,增加了类型校验,在typescript中主要给我们提供了以下数据类型 布尔类型(boolean) 数 ...

  10. Linux下文件乱码问题

    通常编码会在windows环境下进行,当把windows下的代码拷贝到linux环境时,会出现 error: “build.sh /bin/bash^M: 坏的解释器:没有那个文件或目录” 等等类似问 ...