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再次挂到就绪队列上,下次处理就绪队列时,若发现没有新事件则不拷贝到用户空间。

发布了13 篇原创文章 · 获赞 3 · 访问量 1987
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章