epoll原理的一点总结

       之前只是使用epoll,也只在别人的博客上了解过大致的工作原理。这几天刷面经,看到许多问epoll的问题,于是花了一天去看了看epoll的源码,给自己也整理了一个原理简述。

       epoll是linux的IO多路复用机制的接口,要讲epoll的原理,得从它的三个函数逐个介绍:

       首先是epoll_create,这个函数会做两件事,一是分配一块连续的物理空间初始化eventpoll对象,eventpoll中包含一颗红黑树,一条准备就绪链表和一条溢出链表;二是获取一个匿名文件,分配struct file对象和与之对应的fd,将eventpoll对象放在struct file中的private成员中,这样就可以通过fd找到struct file从而找到eventpoll对象,实现unix的一切皆文件。

       其次是epoll_ctl,这个函数可以用于添加,修改和移除事件,以添加为例,首先搜索红黑树判断新添加的fd是否已经存在,若不存在则从slab层分配一个epitem对象挂在红黑树上,然后根据epitem创建一个epoll_entry对象挂在相应设备的等待队列上,并设置事件发生时的回调函数。回调函数内容为将被激活的事件挂在eventpoll的就绪队列或溢出队列上,然后唤醒epoll_wait。

       最后是epoll_wait,检查就绪队列,是否为空,若不为空则先处理就绪队列,逐个拷贝到用户空间,这个过程如果有新的事件发生了,则将epitem挂到溢出队列上;然后将溢出队列对象挂到就绪队列上;若使用了LT模式,则会将拷贝到用户空间的epitem再次挂到就绪队列上,下次处理就绪队列时,若发现没有新事件则不拷贝到用户空间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值