嵌入式大厂面经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编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。
查看16道真题和解析