面试题答案
一键面试数据结构
- 红黑树:epoll使用红黑树来管理用户关注的文件描述符集合。红黑树是一种自平衡二叉查找树,插入、删除操作的时间复杂度为O(log n)。在高并发场景下,频繁地添加或删除要监听的文件描述符时,相较于select和poll的线性结构,epoll能更高效地管理这些文件描述符,select采用数组结构,添加和删除操作时间复杂度为O(n);poll采用链表结构,虽然添加和删除相对容易,但查找等操作时间复杂度也是O(n)。
- 就绪列表:epoll通过一个双向链表来维护就绪的文件描述符。当有文件描述符就绪时,内核将其添加到这个双向链表中。这样在获取就绪文件描述符时,遍历该双向链表即可,时间复杂度为O(1)。而select和poll每次都需要遍历全部关注的文件描述符集合来找出就绪的文件描述符,时间复杂度为O(n)。
工作模式
- LT(水平触发)模式:只要文件描述符对应的读缓冲区或写缓冲区有数据(可读或可写条件满足),就会一直通知应用程序。应用程序可以选择每次只处理部分数据,然后epoll会继续通知,直到缓冲区数据处理完毕。这种模式下,应用程序需要不断地检查文件描述符状态,确保数据处理干净,否则可能会丢失事件通知。
- ET(边缘触发)模式:只有当文件描述符的状态发生变化(如从不可读变为可读,或从不可写变为可写)时,才会通知应用程序。ET模式是一种更高效的模式,因为它减少了不必要的通知次数。但在ET模式下,应用程序必须一次性将缓冲区的数据读取或写入完毕,否则可能错过后续数据的处理,对应用程序的编写要求更高。
内核与用户空间交互
- mmap:epoll使用mmap技术实现内核空间和用户空间的内存映射。这样可以避免在每次从内核获取就绪文件描述符时进行大量的数据拷贝,提高了数据传输效率。而select和poll每次都需要在内核空间和用户空间之间拷贝数据,随着文件描述符数量增多,拷贝开销会显著增大。
综上所述,epoll通过高效的数据结构、灵活的工作模式以及优化的内核与用户空间交互方式,在高并发TCP连接环境中展现出比select和poll更好的性能。