面试题答案
一键面试- 支持文件描述符数量:
select
支持的文件描述符数量有限,通常受限于FD_SETSIZE
,一般为1024。poll
理论上没有类似select
那样的硬限制,但在实际应用中,大量文件描述符会导致性能问题。epoll
能支持大量的文件描述符,通常能轻松处理上万甚至更多的文件描述符。
- 事件通知方式:
select
使用轮询方式检查文件描述符集合,每次调用都需要遍历所有注册的文件描述符,时间复杂度为O(n),随着文件描述符数量增多,性能急剧下降。poll
同样采用轮询方式,虽然结构上比select
更灵活,但本质上也是O(n) 的时间复杂度,对于大量文件描述符效率不高。epoll
采用回调机制,当有事件发生时,内核会将事件添加到一个就绪列表中,应用程序通过epoll_wait
只需要检查这个就绪列表,时间复杂度为O(1),大大提高了处理效率。
- 内存拷贝开销:
select
在每次调用时都需要将用户态的文件描述符集合拷贝到内核态,返回时又要将内核态的结果拷贝回用户态,当文件描述符数量较多时,这种内存拷贝开销较大。poll
与select
类似,每次调用也需要进行用户态和内核态之间的数据拷贝,同样存在大量文件描述符时的拷贝开销问题。epoll
通过epoll_ctl
注册文件描述符到内核态的红黑树中,之后仅在epoll_wait
时返回就绪的事件列表,无需每次都进行大量数据拷贝,减少了内存拷贝开销。