嵌入式大厂面经select、poll、epoll面试考点(持续更新中!)
这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!
select、poll、epoll面试考点
这三种都是 I/O 多路复用的机制,是 Linux 环境下处理高并发网络连接的重要技术。下面我将详细讲解它们的特点、区别和面试考点。
1. select
基本原理
select 是最早的 I/O 多路复用机制,通过一个系统调用监控多个文件描述符的状态变化。
主要特点
- 监控三类文件描述符集合:读、写、异常
- 使用位图(bitmap)表示文件描述符集合
- 有最大文件描述符数量限制(通常为 1024)
- 每次调用都需要将整个文件描述符集合从用户空间拷贝到内核空间
- 返回后需要遍历整个集合找出就绪的文件描述符
代码示例
fd_set readfds, writefds, exceptfds; struct timeval timeout; FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); // 添加感兴趣的文件描述符 FD_SET(sockfd, &readfds); // 设置超时 timeout.tv_sec = 5; timeout.tv_usec = 0; int ret = select(maxfd + 1, &readfds, &writefds, &exceptfds, &timeout); if (ret > 0) { // 检查哪些文件描述符就绪 if (FD_ISSET(sockfd, &readfds)) { // sockfd 可读 } }
2. poll
基本原理
poll 是 select 的改进版,解决了一些 select 的限制。
主要特点
- 使用 pollfd 结构体数组代替位图
- 没有最大文件描述符数量的限制(除了系统资源限制)
- 仍然需要将整个文件描述符集合从用户空间拷贝到内核空间
- 返回后仍需遍历整个集合找出就绪的文件描述符
代码示例
struct pollfd fds[100]; fds[0].fd = sockfd; fds[0].events = POLLIN | POLLOUT; // 监听读写事件 int ret = poll(fds, 100, 5000); // 超时 5000 毫秒 if (ret > 0) { // 检查哪些文件描述符就绪 if (fds[0].revents & POLLIN) { // sockfd 可读 } if (fds[0].revents & POLLOUT) { // sockfd 可写 } }
3. epoll
基本原理
epoll 是 Linux 特有的 I/O 多路复用机制,针对大规模并发连接设计,性能显著优于 select 和 poll。
主要特点
- 使用红黑树存储文件描述符集合
- 使用事件驱动机制,维护就绪列表
- 没有最大文件描述符数量的限制
- 通过 epoll_ctl 注册文件描述符,避免每次调用都拷贝整个集合
- 采用回调机制,只返回就绪的文件描述符,避免遍历整个集合
- 支持边缘触发(ET)和水平触发(LT)两种模式
代码示例
// 创建 epoll 实例 int epfd = epoll_create(1); // 注册事件 struct epoll_event ev; ev.events = EPOLLIN | EPOLLET; // 读事件,边缘触发模式 ev.data.fd = sockfd; epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev); // 等待事件发生 struct epoll_event events[MAX_EVENTS]; int nfds = epoll_wait(epfd, events, MAX_EVENTS, 5000); // 超时 5000 毫秒 // 处理就绪事件 for (int i = 0; i < nfds; i++) { if (events[i].data.fd == sockfd) { // sockfd 可读 } }
4. 三者对比
数据结构
- select:使用三个位图表示三类文件描述符集合
- poll:使用 pollfd 结构体数组
- epoll:使用红黑树存储
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式面试八股文全集 文章被收录于专栏
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。