epoll的作用是进行I/O的多路复用,可以同时监听多个fd产生的事件。常结合异步处理实现单线程的高并发。在多核环境中,可以结合多线程实现负载分担。
本文主要分析一下linux epoll的实现。
API
epoll_create(int size);.
epoll_create1(int flags);
创建一个epoll实例,并返回与之关联的一个fd.这是后面我们继续使用epoll其它接口的基础。
从内核2.6.27开始,加入了一个新的epoll_create1,这个函数有一个flag参数,可以指定EPOLL_CLOEXEC标志,标识在exec之后关闭fd.
来看下创建epoll都做了些什么?
创建一个struct eventpoll结构,每个epoll使用这个结构管理其监听的所有fd以及就绪fd.
然后创建一个epoll对应的file结构,并将创建的epoll挂到file的private_data上(这是vfs的通常做法,将具体文件相关的结构挂到私有数据上).
将file结构的f_op填充为epoll实现eventpoll_fops.这样利用多态实现以后对epoll文件file的相关操作就能映射到epoll具体的实现上。
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events;