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

全部评论

相关推荐

评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客企业服务