Skip to content

epoll的实现原理

参考文章

1、cnblogs 为什么人们总是认为epoll 效率比select高 # epoll原理概述

比较好的概述,但是并不深入,有些地方是比较含糊的,便于掌握大致原理

2、idndx The Implementation of epoll 系列

源代码级别的解读s

cnblogs 为什么人们总是认为epoll 效率比select高 # epoll原理概述

NOTE:

1、epoll是基于中断回调的

调用**epoll_create**时,做了以下事情:

1、内核帮我们在epoll文件系统里建了个file结点;

2、在内核cache里建了个**红黑树**用于存储以后epoll_ctl传来的socket;

3、建立一个list链表,用于存储**准备就绪**的事件。

调用**epoll_ctl**时,做了以下事情:

1、把socket放到epoll文件系统里file对象对应的红黑树上;

2、给内核中断处理程序注册一个回调函数,告诉内核,如果这个句柄的中断到了,就把它放到准备就绪list链表里。

调用**epoll_wait**时,做了以下事情:

观察list链表里有没有数据。有数据就返回,没有数据就sleep,等到timeout时间到后即使链表没数据也返回。而且,通常情况下即使我们要监控百万计的句柄,大多一次也只返回很少量的准备就绪句柄而已,所以,epoll_wait仅需要从内核态copy少量的句柄到用户态而已。