zoukankan      html  css  js  c++  java
  • 关于epoll,select,poll的理解

    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

     

     

     

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

     

     

  • 相关阅读:
    十大排序算法之选择排序(2)
    十大排序算法之冒泡排序(1)
    2018年年度总结
    敏捷软件开发学习笔记(四)之结构型设计模式
    敏捷软件开发学习笔记(三)之创造型设计模式
    elasticsearch+head+kibana
    闭包函数延迟绑定问题
    初谈dango的post提交csrf设置和文件上传
    浏览器的同源策略,及如可跨域
    socket并发通信的几种方式
  • 原文地址:https://www.cnblogs.com/yinbiao/p/10945624.html
Copyright © 2011-2022 走看看