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

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

全部评论

相关推荐

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. 面试表现:清晰表达,展现潜力手写代码:面试时可能会被要求在白板或纸上书写代码,平时要多练习。项目深挖:对自己的项目了如指掌,能够清晰阐述,并准备好项目中涉及的扩展知识。态度诚恳:遇到不会的问题,可以坦诚说明,但尽量给出自己的思考逻辑,展现学习能力和解决问题的思路。
备战春招/暑实,现在应该...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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