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. MySQL UPDATE 更新

    以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法: UPDATE table_name SET field1=new-value1, field2=new-value2 [W ...

  2. hive 属性随笔记录

    set hive.mapred.mode=strict; //设置hive执行模式,默认为nonstrict(非严格模式),这里设置为严格模式 set hiveconf:hive.cli.print. ...

  3. python3.x中lambda表达式的处理与python2不一样

    lambda表达式,在python2中的表达式和python3不同,原来只要: >>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])          ...

  4. T-MAX组--项目冲刺(第五天)

    T-MAX组--项目冲刺(第五天) THE FIFTH DAY 项目相关 作业相关 具体描述 所属班级 2019秋福大软件工程实践Z班 作业要求 团队作业第五次-项目冲刺 作业正文 T-MAX组--项 ...

  5. python编译exe后在windows2003上报错

    最近使用python写了一个分析nmon结果的小程序,用的是python3.8.win7环境,pyinstaller生成exe后,在win7上运行一切正常.拿到内网分享给团队成员,在windows20 ...

  6. PHP的ini_set函数用法

    PHP   ini_set用来设置php.ini的值,在函数执行的时候生效,脚本结束后,设置失效.无需打开php.ini文件,就能修改配置,对于虚拟空间来说,很方便. 函数格式:string   in ...

  7. 乌龙茶生产过程中挥发性成分吲哚的形成 | Formation of Volatile Tea Constituent Indole During the Oolong Tea Manufacturing Process

    吲哚是啥?在茶叶成分中的地位?乌龙茶?香气,重要的前体,比如色氨酸Trp.IAA. Indole is a characteristic volatile constituent in oolong ...

  8. Js 实现返回上一页

    Js 实现返回上一页 <a href="javascript:history.go(-1)">返回上一页</a> <a href="java ...

  9. elasticsearch使用BulkProcessor批量入库数据

    在解决es入库问题上,之前使用过rest方式,经过一段时间的测试发现千万级别的数据会存在10至上百条数据的丢失问题, 在需要保证数据的准确性的场景下,rest方式并不能保证结果的准确性,因此采用了el ...

  10. 项目启动时警告 Establishing SSL connection without server's identity verification is not recommended

    项目启动时控制台提示警告: Tue May 14 23:16:10 CST 2019 WARN: Establishing SSL connection without server's identi ...