一图总结epoll的总体工作流程

大家好,前面一篇文章我们介绍了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等技术内容,点击立即学习:

epollLinux内核提供的个I/O事件通知机制,用于高效地处理大量并发文件描述符(file descriptor,简称fd)。与传统的select/poll相比,epoll具有更高的效率和更好的可扩展性,因为它避免了每次调用时的全量扫描fd集合,只关注那些有事件发生的fd。 epoll工作流程大致如下: 1. 创建epoll实例:使用epoll_create()函数创建epoll实例,该函数返回个句柄,用于后续操作。 2. 添加监听事件:使用epoll_ctl()函数将需要监听的文件描述符及其感兴趣的事件(如EPOLLIN表示可读,EPOLLOUT表示可写)添加到epoll实例中。 3. 等待事件发生:调用epoll_wait()函数等待个或多个事件的发生。该函数会阻塞当前线程,直到至少有个事件发生或超时。epoll_wait()的返回值是发生事件的文件描述符数量。 4. 处理事件:对于epoll_wait()返回的每个事件,根据返回的事件类型和文件描述符进行相应的处理。 5. 删除/修改监听事件:在不再需要监听某个fd或者需要修改监听事件类型时,可以使用epoll_ctl()函数来删除或修改。 6. 关闭epoll实例:使用close()函数关闭epoll实例,释放相关资源。 epoll的工作机制依赖于两种主要的数据结构:epoll实例和红黑树。它还使用个就绪链表来存放已经准备好的文件描述符。epoll使用事件通知的方式,仅在文件描述符状态发生变化时才进行处理,从而大幅减少了系统调用和CPU时间的消耗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值