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;
ui

本文详细分析了Linux epoll的实现,包括epoll_create、epoll_ctl、epoll_wait等API的使用,阐述了边缘触发(ET)和水平触发(LT)模式的区别,以及epoll在多线程和多epoll实例下的行为。epoll通过红黑树高效管理fd,当事件发生时,通过ep_poll_callback通知epoll,然后由epoll_wait返回就绪事件。
订阅专栏 解锁全文
2482

被折叠的 条评论
为什么被折叠?



