我对于网络协议比较有兴趣,同时最近也有一些面试候选人希望从事服务器偏底层的工作,所以关于IO复用技术以及实现细节就成了考点,虽然我(斗胆)问了epoll是如何实现这么一个问题,但是汗颜的是我也没有看过源码,只是看过一些网络资料而已,本着做技术要务实的态度,这两天抽空看了看3.4的源码,总结一下epoll的实现,如有任何错误之处欢迎大家指正。
本文不讨论epoll相对于其它IO复用技术的优势,也不讨论preactor以及reactor的概念。
- 等待队列
epoll实现中大量使用了linux等待队列,等待队列有很多用途,可用于中断处理、休眠等待。进程可以在某些资源上进行等待,并由资源管理程序在适当的时候唤醒。
epoll中使用等待队列的方式主要有两类:
一类是epoll_wait调用时,如果没有就绪事件,则当前进程将自己block在一个等待队列上(eventpoll->wq)
另一类是将target fd加入target file的等待队列上,等待就绪事件的回调
本文不详细介绍等待队列的细节,以上知识足够理解epoll的实现思路
- epoll实现
epoll暴露给用户的接口一共三个epoll_create, epoll_wait, epoll_ctl
首先是epoll_create,epoll_create1会调用ep_alloc,其中比较关键的是init两个wait_queue
init_waitqueue_head(&ep->wq);
init_waitqueue_he