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

全部评论

相关推荐

从去年秋招开始,到最近春招,一共面了🐧的三个岗位,时间线如下:-----PCG-大数据平台-后台开发-----一面:2024/9/3二面:2024/9/4(SQL没撕出来,挂了)(这个还算正常,后面的就开始抽象起来了)-----TEG-研发管理部-后台开发-----一面:2024/9/11二面:2024/9/18三面:2024/9/27HR面:2024/10/9(泡了几个月,排序挂)(此时HR面过了之后先是面评没提交导致自动挂然后邮件联系又拉起来了,之后就是录用评估中状态一直从24年10月卡到了25年3月,简直硬控我4个多月,令人忍俊不禁。。。😅)-----IEG-魔方工作室-后台开发-----一面:2025/3/27二面:2025/4/2HR面:2025/4/8(一周后排序挂)(因为秋招已经签了三方,所以春招就简单投了投,随后就被该岗位给捞了,据面试官介绍是做暗区突围海外版后端的(游戏服务器,还是海外非核心,只能说buff叠满了。。。😂),面完两轮技术面就进HR面了,当时就感觉有点奇怪,随后面完HR面泡了一周多的池子排序挂掉了,估计是因为已经签三方了😢)自从之前在🐧WXG实习了几个月转正失败跑路以来,就还是想再当一回🐧孝子(有鹅选鹅的含金量),但是造化弄人,面了三个岗,两个排序挂(要是技术面挂其实还能接受,排序挂是真的难绷。。。😭),最终还是只能遗憾离场了啊啊啊啊,我直接化身🐧黑子了#校招# #腾讯# #秋招你被哪家公司挂了?# #春招进度记录#
点赞 评论 收藏
分享
04-10 21:12
已编辑
蚌埠坦克学院 C++
一面面试官应该是主管,感觉年纪有点大。狂问八股50min,最后算法题+反问10min。1.&nbsp;数据库为什么使用B+树而不是平衡树,B树和B+树的区别2.&nbsp;MySQL慢查询怎么优化3.&nbsp;B+树索引怎么更新4.&nbsp;了解LSM树嘛5.&nbsp;C++函数定义在头文件会怎么样,模版函数应该定义在哪里6.&nbsp;C++引用是怎么实现的7.&nbsp;C++&nbsp;用过以两个下划线开头的变量吗8.&nbsp;C++&nbsp;map和unordered_map的区别&nbsp;时间复杂度9.&nbsp;C++&nbsp;智能指针的使用场景。怎么用智能指针管理文件、数据库连接等各种各样的资源。10.&nbsp;使用页表转换地址的详细流程11.&nbsp;malloc返回的是虚拟地址吗?物理地址什么时候会被使用?12.&nbsp;哪些情况下会栈溢出?13.&nbsp;redis和MySQL的主从复制分别怎么进行的14.&nbsp;TCP和UDP的区别&nbsp;15.&nbsp;TCP怎么保证数据有序?使用TCP的应用层收到的数据可能是乱序的嘛(没太懂想问什么)16.&nbsp;C++&nbsp;三种继承权限&nbsp;public和private继承的意义(语义)17.&nbsp;设计模式&nbsp;开闭原则&nbsp;单例模式18.&nbsp;网络编程中使用的几个函数与网络连接建立过程的对应关系算法题:爬楼梯平时看牛客上的面经,我感觉都挺难的,但是几次面试下来感觉实际问的问题都不难???&nbsp;可能因为不是核心组? 二面KPI,面试官迟到3min,到了之后让我等5min(感觉他很忙,应该是没时间面试),也没开摄像头,然后10min问完了,不过问的也都是我不太会的,基本上也没怎么答。1.&nbsp;MySQL&nbsp;Spider了解吗2.&nbsp;InnoDB和MyISAM的区别3.&nbsp;基于Redis协议的数据库了解吗?&nbsp;4.&nbsp;RocksDB了解吗?
查看44道真题和解析
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客企业服务