FANYI / 嵌入式Linux / INTERVIEW 07
多个串口、网络Socket或文件描述符同时等待事件,面试官常会追问为什么不能简单地每个Socket开一个线程,select/poll/epoll各有什么适用场景。
面试先给结论
select和poll会把关注的描述符集合交给内核等待事件,返回后由程序检查;epoll通过注册兴趣事件并取回就绪事件减少大量无关描述符的重复扫描。ET边沿触发通常要用非阻塞I/O循环读写到EAGAIN,否则可能漏掉尚未处理完的数据。

01先区分系统调用机制
select使用fd_set位图,常见实现受到FD_SETSIZE等接口限制;poll使用pollfd数组,避免相同的固定fd_set位图上限;epoll在Linux内核维护兴趣列表并提供事件就绪接口。性能还受描述符数量、活动比例和唤醒模式影响。
02LT和ET的关键差别
LT(电平触发)只要条件仍满足就可再次通知;ET(边沿触发)通常在就绪状态发生变化时通知。ET配合非阻塞fd,收到可读事件后循环read/recv直到EAGAIN,可避免缓冲中还有未读数据却不再产生新通知。
03常见生产问题
忙循环高CPU可能来自没有正确处理EPOLLOUT、错误地反复注册、未清空缓冲或异常fd;低吞吐也可能是回调里做了大量阻塞操作。epoll不自动解决应用层协议分帧和线程安全问题。
04如何排查并选择
少量设备、简单功能使用select或poll完全可以;大量Socket或事件驱动服务器可考虑epoll。用strace、perf或统计日志查看epoll_wait唤醒次数、返回事件及单次处理耗时,结合真实负载选择。
面试中常见失分点
认为epoll在任何描述符数量下必然比poll快。
ET模式下只读一次就返回,忽略仍未消费的内核接收缓冲区。
面试官可能继续追问
客户端Socket始终可写,为什么EPOLLOUT可能导致epoll_wait频繁返回?

扫码关注































