面试题答案
一键面试常见轮询机制实现方式
- select
- 原理:select 函数监视的文件描述符分为三类,分别是可读、可写和异常事件。它会阻塞等待直到这些文件描述符中的一个或多个发生了状态改变。内核会遍历所有被监视的文件描述符,检查它们的状态。
- 特点:
- 最大文件描述符限制:通常受限于系统的
FD_SETSIZE
,一般为 1024。 - 数据结构:使用
fd_set
数据结构来存储文件描述符集合,操作这些集合的宏(如FD_SET
、FD_CLR
等)相对复杂。
- 最大文件描述符限制:通常受限于系统的
- poll
- 原理:poll 函数通过一个
pollfd
数组来指定需要监视的文件描述符及其事件。与 select 类似,它也会阻塞等待文件描述符状态的改变。内核同样需要遍历整个pollfd
数组来检查文件描述符状态。 - 特点:
- 无最大文件描述符限制:理论上没有固定的最大文件描述符数限制,它更灵活,不受
FD_SETSIZE
的约束。 - 数据结构:使用
pollfd
结构体数组,相比fd_set
更直观和易于管理。
- 无最大文件描述符限制:理论上没有固定的最大文件描述符数限制,它更灵活,不受
- 原理:poll 函数通过一个
使用场景区别
- select
- 适合场景:适用于小规模的网络连接场景,当需要监视的文件描述符数量较少(远小于 1024)时,select 可以很好地工作。例如一些简单的本地服务,只与少数几个客户端进行交互。
- poll
- 适合场景:适用于需要处理中等规模网络连接的场景,当需要监视的文件描述符数量较多,但又不至于达到非常庞大的程度时,poll 是一个不错的选择。例如一些小型的网络服务器,可能同时处理几百个客户端连接。
性能特点区别
- select
- 性能:随着监视的文件描述符数量增加,性能会显著下降。因为每次调用 select 时,内核需要遍历整个
fd_set
集合,时间复杂度为 O(n)。并且每次调用 select 时都需要将用户空间的fd_set
数据拷贝到内核空间,开销较大。
- 性能:随着监视的文件描述符数量增加,性能会显著下降。因为每次调用 select 时,内核需要遍历整个
- poll
- 性能:在性能上比 select 有所提升,虽然内核同样需要遍历
pollfd
数组,但由于它没有最大文件描述符数量的硬限制,在处理较多文件描述符时表现更好。不过,它依然存在将用户空间数据拷贝到内核空间的开销,时间复杂度也为 O(n),所以在大规模并发场景下性能也会受限。
- 性能:在性能上比 select 有所提升,虽然内核同样需要遍历