深圳爱培科 - 嵌入式工程师 - 二面

1. TCP的三次握手和四次挥手详细过程,TIME_WAIT状态的作用是什么?如何优化TIME_WAIT过多的问题?

答案:

  • 三次握手:SYN → SYN+ACK → ACK,建立连接
  • 四次挥手:FIN → ACK → FIN → ACK,关闭连接
  • TIME_WAIT作用: 确保最后的ACK能到达对端防止旧连接的数据包干扰新连接持续2MSL(Maximum Segment Lifetime)
  • 优化方法: 调整内核参数:net.ipv4.tcp_tw_reuse=1、net.ipv4.tcp_tw_recycle=1使用SO_REUSEADDR选项让客户端主动关闭连接使用连接池复用连接

2. epoll的工作原理,与select/poll的区别?ET和LT模式的区别及应用场景?

答案:

  • epoll优势: 使用红黑树管理fd,无fd数量限制使用事件驱动,只返回就绪的fd,时间复杂度O(1)使用mmap共享内核和用户空间内存,减少拷贝
  • ET vs LT: LT(水平触发):只要有数据就通知,可能重复通知,编程简单ET(边缘触发):只在状态变化时通知一次,需要一次读完,效率更高但编程复杂
  • select/poll:每次调用需要拷贝fd集合,遍历所有fd,O(n)复杂度

3. 如何实现一个高性能的TCP服务器?多线程、多进程、IO多路复用各有什么优缺点?

答案:

  • 多线程模型: 优点:共享内存,通信方便缺点:线程安全问题,上下文切换开销适用:中等并发(几百连接)
  • 多进程模型: 优点:隔离性好,稳定缺点:创建开销大,通信复杂适用:需要隔离的场景
  • IO多路复用+线程池: 优点:高并发,资源利用率高缺点:编程复杂适用:高并发场景(万级连接)
  • 最佳实践:Reactor模式(主线程epoll监听,工作线程处理业务)

4. 什么是惊群效应?如何避免?SO_REUSEPORT的作用是什么?

答案:

  • 惊群效应:多个进程/线程同时监听同一socket,当连接到来时,所有进程被唤醒,但只有一个能accept成功,造成资源浪费
  • 避免方法: 使用SO_REUSEPORT(Linux 3.9+),内核负载均衡分发连接使用锁保护accept使用EPOLLEXCLUSIVE标志(Linux 4.5+)主进程accept后分发给工作进程
  • SO_REUSEPORT:允许多个socket绑定同一地址端口,内核自动负载均衡

5. 共享内存的实现原理?如何保证共享内存的同步?System V和POSIX共享内存的区别?

答案:

  • 实现原理:通过页表映射,将同一物理内存映射到不同进程的虚拟地址空间
  • 同步机制: 信号量(sem_wait/sem_post)互斥锁(pthread_mutex_t需设置PTHREAD_PROCESS_SHARED)文件锁(flock/fcntl)
  • System V vs POSIX: System V:shmget/shmat/shmdt,使用key标识,需要ipcs/ipcrm管理POSIX:shm_open/mmap,使用文件名标识,更简洁,推荐使用

6. 死锁的四个必要条件?如何检测和避免死锁?在项目中遇到过死锁吗,如何解决的?

答案:

  • 四个条件:互斥、占有并等待、不可抢占、循环等待
  • 避免方法: 按固定顺序加锁使用trylock避免阻塞设置超时机制使用死锁检测工具(Valgrind的helgrind、ThreadSanitizer)
  • 检测方法: 资源分配图检测环使用pstack查看线程堆栈使用gdb attach调试

7. 内存泄漏的原因和检测方法?如何使用Valgrind进行内存调试?

答案:

  • 常见原因: malloc后忘记freenew后忘记delete循环引用(智能指针)文件描述符未关闭
  • 检测工具: Valgrind:valgrind --leak-check=full ./programAddressSanitizer:编译时加-fsanitize=addressmtrace:glibc提供的内存跟踪
  • 预防:使用智能指针、RAII、代码审查

8. 什么是零拷贝技术?sendfile和splice的区别?在什么场景下使用?

答案:

  • 零拷贝:减少数据在内核态和用户态之间的拷贝次数,提高性能
  • sendfile:直接在内核空间传输文件到socket,适合文件传输(HTTP服务器)
  • splice:在两个fd之间移动数据,通过管道实现,更灵活
  • 应用场景:文件服务器、代理服务器、大文件传输

9. TCP的滑动窗口机制?拥塞控制算法有哪些?如何调优TCP参数?

答案:

  • 滑动窗口:流量控制机制,接收方通告窗口大小,发送方据此控制发送速率
  • 拥塞: 慢启动:指数增长拥塞避免:线性增长快速重传:收到3个重复ACK立即重传快速恢复:减半窗口后继续传输

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论

相关推荐

昨天 19:12
门头沟学院 Java
先说说自己的情况,家里帮不上忙,本科很一般,硕士是211、期间也没有太知名的实习,基本都给导师打杂了。因为知道背景一般所以一直在网上刷八股,算法题,目前拿到了几个offer。纠结了一周多,现在决定接人行金科公司的offer了,不想再拖了。目前自己拿到的offer,2个互联网的,2个国企的,其中一个是成方金科,人民银行的软开中心,还有一个不是太好的公司。互联网的一个业务还行,薪资也还行,但吐槽内部管理的太多了。另一个薪资稍微低一些,聊下来感觉强度比较大,综合比较觉得性价比不高。成方金科其实一直很纠结,小红书上看到有说加班多的,有说去年没发年终奖的,但是整体面试体验非常好,面试官都挺和善的,HR也是有问必答,感觉比较实在,和我没去的那家国企简直一个天上一个地上。而且薪资真的是我知道的国央企里最高的了,问了HR也很稳定。所以这两天各种找关系去打听,联系上了一个别的学院的学姐,听她说完了之后自己想开了很多。首先工作确实很稳定,他们部门这几年都没有离职的,公司没有末位淘汰。工作强度看项目,有的大项目强度比较大,可能一周三天加班,不过是极少数。团队中没那么多勾心斗角的,大多数同事都比较nice,但也听说有的团队氛围不是太好。关于年终奖听说是去年有管理要求,所以只发了一部分,今年就正常了(好像是改了发放规则)。另外对新人比较友好,他们这一届安排的导师都还不错,每年还给校招生评优秀新员工。而且她说有比她早几届的,几乎年年晋升,目前职级都T7了(硕士进去统一是4级),整体评价还是看工作表现,评优秀项目、评绩效这些只要表现好,校招生也有份。最后她也劝我别太被网上的消息忽悠了,还是自己想清楚,因为网上的只是很片面的一些消息,工作后她会觉得很多人只是在网上宣泄情绪,而不是负责任的发言(听完后有点对网上消息豁然开朗的感觉)。我最终决定接,也是觉得以自己的背景而言,拿成方金科的offer已经算是不错的选择了。而且确实每个公司都会有人吐槽,互联网吐槽的更多,但是从之前自己面试的感受以及和HR沟通的感受来看,我觉得整体应该还是挺好的(当然他们的薪资也真的是国央企里很好的),真有不好的可能去了别的地也躲不过,还是自己适应吧。哦对了户口,好像比较保密,没打听到太多,据说是有人解决了,有人没解决,HR也说的是部分解决,不承诺解决,随缘吧。
点赞 评论 收藏
分享
1. 简历准备:用项目打动面试官对于嵌入式开发岗,技术项目经历是简历的绝对核心。项目来源:优先展示实习经历。若无实习,可将课程设计、电子竞赛、实验室课题进行深度包装,重点突出你个人完成的技术模块。如果这些都没有,可以在GitHub等平台寻找一个完整的嵌入式项目(如基于STM32的智能小车、RTOS多任务应用、物联网数据采集终端等)进行深入研究、复现并添加自己的优化功能,这将成为你扎实的项目经历。简历撰写:描述项目时,使用“ARM Cortex-M系列单片机”、“FreeRTOS/RT-Thread”、“UART/SPI/I2C通信”、“传感器数据采集”、“硬件驱动开发”等专业术语。务必遵循STAR原则(情境、任务、行动、结果),清晰说明你的职责、采用的技术方案、解决的难点以及最终成果(如实现功能、提升效率、降低功耗等具体指标)。模拟问答:完成简历后,务必针对每个项目预设技术问题。可以借助AI工具模拟面试官提问,并准备好答案。重点准备:项目架构、为何选此芯片或RTOS、通信协议细节、调试中遇到的棘手问题及解决方案、代码优化思路等。确保你能流畅、深入地讲解,切忌夸大。2. 高效投递:多通道并进,主动跟进投递渠道排序:回复效率上,通常 内推 > 招聘软件/校园就业网 > 公司官网。内推码可通过校友、牛客网、知乎等平台寻找。并行投递:对心仪公司,若没有内推,可在公司官网、主流招聘软件、牛客网、猎聘等多个渠道同时提交申请,增加被HR看到的几率。主动沟通:在招聘软件上投递后,可主动给该公司的HR或技术负责人发送简短留言,介绍你的核心技能与岗位的匹配点,能有效提高回复率。3. 技术备考:夯实基础,针对突破嵌入式面试考察范围广,需系统准备。核心基础:C语言是重中之重,尤其是指针、内存管理、数据结构、位操作及常见面试算法。计算机基础如操作系统原理、进程/线程、内存管理是高频考点。硬件知识:了解常见单片机架构、外设接口、通信协议和基本的电路知识。准备一两个你熟悉的MCU系列。操作系统:深入理解至少一种实时操作系统,如FreeRTOS或RT-Thread的任务调度、同步机制、中断管理等。4. 面试表现:清晰表达,展现潜力手写代码:面试时可能会被要求在白板或纸上书写代码,平时要多练习。项目深挖:对自己的项目了如指掌,能够清晰阐述,并准备好项目中涉及的扩展知识。态度诚恳:遇到不会的问题,可以坦诚说明,但尽量给出自己的思考逻辑,展现学习能力和解决问题的思路。
备战春招/暑实,现在应该...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务