23 | Linux利器:epoll的前世今生
该思维导图由 AI 生成,仅供参考
epoll 的用法
- 深入了解
- 翻译
- 解释
- 总结
Linux网络编程中的高性能I/O多路复用技术——epoll在提高系统性能方面具有显著优势。文章通过对比select、poll和epoll的性能表现,详细介绍了epoll的用法,包括epoll_create、epoll_ctl和epoll_wait三个API的具体操作步骤。作者还给出了基于epoll的服务器程序示例,展示了如何使用epoll实现高性能的网络编程。此外,文章还介绍了epoll的两种模式:条件触发和边缘触发,以及epoll的历史和与其他系统的比较。总的来说,本文为读者提供了深入了解和应用epoll的基础知识,对于从事Linux网络编程或对高性能I/O多路复用技术感兴趣的读者来说,是一篇值得阅读的技术文章。
《网络编程实战》,新⼈⾸单¥59
全部留言(51)
- 最新
- 精选
- 传说中的成大大我回想和对了poll和epoll的代码 觉得效率问题主要出现在 epoll返回的是有事件发生的数组,而poll返回的是准备好的个数,每次poll函数返回都要遍历注册的描述符结合数组 尤其是数量越大遍历次数就越多 我觉得性能差异在这里 抛开阻塞和阻塞i/o层面
作者回复: 这是一个很重要的点,恭喜你悟到了 :)
2019-10-08567 - yusufhttps://github.com/linuxxiaoyu/block 执行后都会重复打印”need read socket_fd“和“poll need to read”,所以select和poll应该都是条件触发
作者回复: 就喜欢你这样努力完成作业,实际写代码的样子。赞赞赞。
2019-10-2121 - moob边缘触发的情况, 如果epoll_wait时提供的events数组太小,那么会错过事件?
作者回复: 如果你读了后面答疑部分的源码就会明白,答案是否定的。如果你设置一个很小的events数组,会影响事件的时效性,也就是说,可能10秒前的一个I/O事件,现在你才收到,但是不会错过事件,其原因是事件总在内核中记录着。你不收,内核里也有;你收的快一点,时效性就越好,表现出对用户的体验就越好。
2019-10-1520 - yusuf之前对epoll01.c中第66行while(1)很困惑,不明白是从哪里跳出这个循环的。后来通过gdb调试分析,发现在55行把socket_fd设置为了非阻塞,然后在68行调用read时,socket_fd没有数据可读会直接返回-1(errno = EAGAIN),从而在73行通过break跳出了while(1)循环。希望对同样有此困惑的同学有所帮助。
作者回复: gdb都用上了,牛~
2019-10-21415 - 空想家LT + non-blocking 和 ET + non-blocking 有什么区别吗?性能谁更好一点? epoll 的惊群问题会讲吗?
作者回复: LT和ET的区别在文稿里已经给出了。 我理解的惊群问题是当一个网络套接字上有事件发生时,多个线程或者进程会感知,从而引发一群线程干活。 我认为设计良好的程序应该避免这样的问题,比如一个套接字只被一个线程所管理。我们后面的框架设计也是遵循了这个原则。
2019-09-30211 - 向东为何在水平触发的epoll03,当tcpclient都退出了,还说有数据可读呢,get event on socket fd ==5,二是请问为何每次都从五开始呢,前面0-5分别是谁占用了呢,谢谢。
作者回复: 因为这部分数据没有被处理掉,而这个正是条件触发的精髓。 至于描述字,我是这么理解的,0,1,2分别被stdin, stdout和stderr所用,3被监听套接字所用,本地连接的客户端描述字是4,那么本地已连接套接字就是5了。
2019-10-036 - herongwei老师,您好,在总结里:“避免了用户态 - 内核态频繁的数据拷贝”这句话是什么意思的呢?文稿中好像没有提到 epoll 的数据拷贝?频繁指的是什么呢?另外,对比之前的 ,select,poll,epoll 三者在数据拷贝之间的区别又有什么不同呢?希望老师回答一下,谢谢!
作者回复: 在后面的章节里对select、poll、epoll这几个技术进行了不同程度的比较,你可以接着往下读。
2019-10-2435 - нáпの゛老师,边沿触发的时候,如果没有把数据全部读完,剩余的未读数据后续是什么情况。在缓存区中会影响socket后续的读写操作吗,比如这会请求其他资源,触发另一个读时间,会不会读到前面未读的数据?还是说不影响,内核在新的读操作之后会清理掉?
作者回复: 当然会读到之前的数据,因为TCP是流式数据,像水流一样,连绵不绝,之前的数据不会被扔掉。
2020-09-024 - ray老师您好, 想跟您请教什么时候会触发EPOLLOUT事件,我们的课程范例好像都只有EPOLLIN事件。 当读事件触发后,为什么不用为fd设置EPOLLOUT事件,就可以直接将资料写回fd,这样我们要怎么知道一个fd是否可写呢? 谢谢老师的解答!
作者回复: 非常好的问题。 实际上,确实需要通过注册EPOLLOUT事件,让内核告诉我们可以往某个fd上写数据,课程只是没有展现这部分的能力而已,而在lib/epoll_dispatcher.c中是会注册EPOLLOUT事件的。
2020-04-274 - Steiner请问如果我用epoll_ctl显式更改event事件,那么epoll_wait会不会检测到,并装载到events数组中?
作者回复: 当然会,自动更新,动态检测,这就是NB的地方啊。
2019-10-234