大家好,前面一篇文章我们介绍了epoll的几个重点内容,详情可查看:关于epoll的四件“小事”。
今天我们就来用一张图片总结下epoll的总体流程,更加直观的帮助各位同学理解epoll内部的实现原理。
其中软中断回调的时候回调函数也整理⼀下:
sock_def_readable: sock 对象初始化时设置的
=> ep_poll_callback : epoll_ctl 时添加到 socket 上的
=> default_wake_function: epoll_wait 是设置到 epoll上的
总结下,epoll 相关的函数⾥内核运⾏环境分两部分:
- ⽤户进程内核态。进⾏调⽤ epoll_wait 等函数时会将进程陷⼊内核态来执⾏。这部分代码负责查看接收队列,以及负责把当前进程阻塞掉,让出 CPU。
- 硬软中断上下⽂。在这些组件中,将包从⽹卡接收过来进⾏处理,然后放到 socket 的接收队列。对于 epoll 来说,再找到 socket 关联的 epitem,并把它添加到 epoll 对象的就绪链表中。 这个时候再捎带检查⼀下 epoll 上是否有被阻塞的进程,如果有唤醒之。
但其实在实践中,只要活⼉⾜够的多,epoll_wait 根本都不会让进程阻塞。⽤户进程会⼀直⼲活,⼀直⼲活,直到 epoll_wait ⾥实在没活⼉可⼲的时候才主动让出 CPU。这就是 epoll⾼效的地⽅所在!
[推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习: