• 传说中的成大大
    2019-10-08
    我回想和对了poll和epoll的代码 觉得效率问题主要出现在 epoll返回的是有事件发生的数组,而poll返回的是准备好的个数,每次poll函数返回都要遍历注册的描述符结合数组 尤其是数量越大遍历次数就越多 我觉得性能差异在这里 抛开阻塞和阻塞i/o层面

    作者回复: 这是一个很重要的点,恭喜你悟到了 :)

    
     8
  • yusuf
    2019-10-21
    之前对epoll01.c中第66行while(1)很困惑,不明白是从哪里跳出这个循环的。后来通过gdb调试分析,发现在55行把socket_fd设置为了非阻塞,然后在68行调用read时,socket_fd没有数据可读会直接返回-1(errno = EAGAIN),从而在73行通过break跳出了while(1)循环。希望对同样有此困惑的同学有所帮助。

    作者回复: gdb都用上了,牛~

     3
     3
  • godtrue
    2019-11-24
    期待后面分享 select/poll/epoll三者产生,随着处理的文件描述符越多性能差异越大的原因?

    看文章内容和评论,目前的依据有三个
    1:避免了用户态-内核态频繁的数据拷贝,这个老师会在后面讲,猜测是零拷贝技术
    2:边缘条件触发比条件触发性能更优,select/poll都是条件触发,这个老师在评论中又讲有人测试过,其实他俩性能之差,并不如理论上讲的那么大,这需要测试下
    3:从poll和epoll的返回值角度来思考,epoll返回的是有事件发生的数组,poll返回的是事件就绪的个数,每次poll返回都需要遍历注册的文件描述符的结果数组,尤其数据量越大遍历次数就越多,这个也是poll相对于epoll慢的原因
    展开
    
     2
  • 贺荣伟
    2019-10-24
    老师,您好,在总结里:“避免了用户态 - 内核态频繁的数据拷贝”这句话是什么意思的呢?文稿中好像没有提到 epoll 的数据拷贝?频繁指的是什么呢?另外,对比之前的 ,select,poll,epoll 三者在数据拷贝之间的区别又有什么不同呢?希望老师回答一下,谢谢!

    作者回复: 在后面的章节里对select、poll、epoll这几个技术进行了不同程度的比较,你可以接着往下读。

     1
     2
  • 刘丹
    2019-09-30
    提个小建议,能否把代码解说(例如:第 41-46 行判断了各种错误情况)作为注释放在代码里?

    作者回复: 这里主要是因为播报员无法通读代码,所以把代码解说拿出来了。

    
     2
  • 西兹兹
    2019-11-06
    边缘触发不是很理解,只通知第一次,如果报文没读完,后续的数据怎么办?

    作者回复: 你的程序要接着把它读完,否则就会没完没了的收到可读事件。

     1
     1
  • Steiner
    2019-10-23
    请问如果我用epoll_ctl显式更改event事件,那么epoll_wait会不会检测到,并装载到events数组中?

    作者回复: 当然会,自动更新,动态检测,这就是NB的地方啊。

    
     1
  • yusuf
    2019-10-21
    https://github.com/linuxxiaoyu/block
    执行后都会重复打印”need read socket_fd“和“poll need to read”,所以select和poll应该都是条件触发

    作者回复: 就喜欢你这样努力完成作业,实际写代码的样子。赞赞赞。

    
     1
  • moob
    2019-10-15
    边缘触发的情况, 如果epoll_wait时提供的events数组太小,那么会错过事件?

    作者回复: 如果你读了后面答疑部分的源码就会明白,答案是否定的。如果你设置一个很小的events数组,会影响事件的时效性,也就是说,可能10秒前的一个I/O事件,现在你才收到,但是不会错过事件,其原因是事件总在内核中记录着。你不收,内核里也有;你收的快一点,时效性就越好,表现出对用户的体验就越好。

    
     1
  • CCC
    2019-10-06
    试了一下select和poll都是条件触发的,发现套接字是readable了只要没被read就会一直报这个套接字可读,而epoll在边缘模式下只会在第一次报套接字可读,可能这也是epoll为什么效率高的缘故吧,因为不用盯着套接字一直报。
    
     1
  • 空想家
    2019-09-30
    LT + non-blocking 和 ET + non-blocking 有什么区别吗?性能谁更好一点?

    epoll 的惊群问题会讲吗?

    作者回复: LT和ET的区别在文稿里已经给出了。

    我理解的惊群问题是当一个网络套接字上有事件发生时,多个线程或者进程会感知,从而引发一群线程干活。

    我认为设计良好的程序应该避免这样的问题,比如一个套接字只被一个线程所管理。我们后面的框架设计也是遵循了这个原则。

    
     1
  • 麻雀
    2020-01-09
    EPOLL_CTL_MOD 修改是什么时候用到,是说能读也能写?

    作者回复: epoll_ctl的函数里吗可以用到,用来对已经注册的fd进行修正,比如改成既可读亦可写。

    
    
  • leving
    2019-12-18
    想问下老师,epoll的边缘触发比水平触发的效率要高,请问下,边缘触发效率高在哪里?

    作者回复: 在代码解析那篇里,我详细分析了边缘触发和水平触发实现上的差异,通俗一点说,边缘触发就是通知你一下,解析来应用程序要自己处理,而水平触发则是你没有处理的话,一直不断的通知你处理。

    
    
  • 林林
    2019-11-22
    epoll 通过改进的接口设计,避免了用户态 - 内核态频繁的数据拷贝,大大提高了系统性能。
    请问避免用户态和内核态之间的频繁数据拷贝,从哪能体现出来?

    作者回复: 从内核实现上能体现出来,你可以看下后面的源码解读部分。

    
    
  • HunterYuan
    2019-11-20
    老师给的例子,是不是把close(efd),给掉了?还是不用关闭

    作者回复: 应该是忘记关了 :)

    
    
  • Steiner
    2019-11-07
    这个注册过的fd好像删不删都无所谓啊

    作者回复: 需要删除掉,否则fd不能复用了。

    
    
  • 贺荣伟
    2019-10-24
    EPOLL_CLOEXEC 标志与 open 调用时的 O_CLOEXEC 标志类似 ,即进程被替换时会关闭打开的文件描述符。
     1
    
  • 小蚂蚁
    2019-10-14
    老师您好能详细讲下select,poll,epoll底层实现原理和差别吗?为什么opoll的性能会大幅优于select和poll呢?能在答疑篇中系统讲下吗?谢谢。

    作者回复: 第29讲里讲到了,答疑篇更是从源码角度深度剖析了,希望可以解答你的疑惑。

    
    
  • 刘丹
    2019-10-04
    代码里的2个continue关键词好像都是可以删除的?

    作者回复: 可以删除。

    
    
  • 张立华
    2019-10-03
    请问下老师,一个epoll队列里有100万个socket,性能怎么样,有没试过

    作者回复: 我没有试过,你可以试下哈。

    
    
我们在线,来聊聊吧