前言
本文以四个方面介绍epoll的实现原理,
1.epoll的数据结构;
2.协议栈如何与epoll通信;
3.epoll线程安全如何加锁;
4.ET与LT的实现。
(epoll实际上在500个以上效率就会比select还有poll高,书上说的是1024.)
epoll的数据结构
两个数据结构红黑树和队列
我们知道epoll是用来监听fd的,那么其底层的数据结构是怎么样的呢?我们要知道epoll在使用的时候fd主要就分为两个集合,一个是就绪状态fd的集合,一个是所有fd的集合,这两种集合有着不同的数据结构来操控
让我们想想我们经常使用的微信,平时是聊天的时候多还是不聊天的时候多。聊天的时候就相当于有信息发送给服务器了,这个用户的fd就处于就绪状态需要服务器来进行响应,不发消息手机放着的时候就是空闲状态fd。根据微信我们就能知道,就绪集合的fd是少很多的。
对于有很多fd的所有fd的集合,我们需要快速的查找并且不造成过多的资源浪费,所以使用的数据结构是红黑树,不仅查找的速度快,而且内存的大小也是可以根据结点的多少来决定。
&emdp; 那这个就绪集合需要什么数据结构来操作呢?就绪集合的每个fd都需要处理不需要查找,没法确定具体fd的多少所以不能使用数组。那就是链式结构,链式结构分为两种一种是队列,一种是栈。使用的是队列,为什么不用栈呢?你可以想象一下,先是五个客户端有数据需要你处理,你用的是栈的数据结构,先处理了四个之后又来了五个,那就又从栈顶开始处理,栈底的就很晚才处理了。为了公平起见,采用先进先出的队列&#