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. locust使用命令

    locust -f locust_demo.py --logfile=locusfile.log

  2. iOS开发之如何在用户删除应用后保持一些数据

    在开发过程中我们有时候在用户删除时候保存一些信息在用户下次安装应用时候使用,这个时候我们可以使用剪切版UIPasteboard的FindUIPasteboard和钥匙串keychain的使用 剪切版剪 ...

  3. C图形化第一步

    之前的贪吃蛇都是在cmd下实现,每次都要调用cls刷新屏幕,简直是闪瞎了我的狗眼. 度娘得知有一种方法可以避免闪烁,即:双缓冲.原理是先在内存中作图,然后将做好的图复制到前台,同时禁止背景刷新. 主要 ...

  4. Oracle 12c 新特性 --- 新增对数据泵操作的审计跟踪

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/leo__1990/article/details/90199263 概念 Oracle Data P ...

  5. cmake 手册详解【转】

    https://www.cnblogs.com/coderfenghc/tag/cmake/   CMake 手册详解(二十三) SirDigit 2012-12-16 22:03 阅读:11058 ...

  6. GWAS这十年 | 10 Years of GWAS Discovery: Biology, Function, and Translation

    相关文章: A Unified Framework for Association Analysis with Multiple Related Phenotypes 太重要了,不得不单独拿出来分析一 ...

  7. 在input内添加小图标或文字(元/月)等

    文字: <td class="formValue"> <div class="input-group"> <input id=&q ...

  8. go语言读写文件

    package main import ( "fmt" "io/ioutil" "os" ) func main() { filename ...

  9. springboot mybatis的pagehelper分页

    maven repositary里,分页组件常用的有两个 com.github.pagehelper » pagehelper-spring-boot-starter  com.github.page ...

  10. 微信jaapi签名

    public WeiXinJsSignature(string weixinUrl) { //string url = ConfigurationManager.AppSettings["U ...