epoll原理:
首先调用epoll_create时内核在epoll文件系统里建了个file结点;除此之外在内核cache里建立红黑树用于存储以后epoll_ctl传来的socket,当有新的socket连接来时,先遍历红黑书中有没有这个socket存在,如果有就立即返回,没有就插入红黑树,然后给内核中断处理程序注册一个回调函数,每当有事件发生时就通过回调函数。把这些文件描述符放到事先准备好的用来存储就绪事件的链表中,调用epoll_wait时,会把准备就绪的socket拷贝到用户态内存,然后清空准备就绪list链表,最后检查这些socket,在LT模式下,如果这些socket上确实有未处理的事件时,该句柄会再次被放回到刚刚清空的准备就绪链表,保证所有的事件都得到正确的处理,而ET模式不会。如果到timeout时间后链表中没有数据也立刻返回。
epoll优点:
(1)epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
(2)本身没有最大并发连接的限制,仅受系统中进程能打开的最大文件数目限制;
(3)效率提升:只有活跃的socket才会主动的去调用callback函数;
(4)省去不必要的内存拷贝:epoll通过内核与用户空间mmap同一块内存实现。
epoll缺点:
(1)如果在并发量低,socket都比较活跃的情况下,select就不见得比epoll慢了。
(2)epoll的跨平台性不够用 只能工作在linux下。
参考
链接: epoll原理详解及epoll反应堆模型.