嵌入式 111 道高频面试题清单:从进程线程到单片机
- 轮次
- 题库
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 什么是进程、线程,彼此有什么区别?
- 多进程、多线程的优缺点分别是什么?
- 什么时候用进程,什么时候用线程?
- 多进程、多线程同步(通讯)的方法有哪些?
- 进程的空间模型是什么?
- 什么是进程上下文、中断上下文?
- 一个进程可以创建多少线程,和什么有关?
- 什么是线程同步和互斥?同步一定阻塞吗?阻塞一定同步吗?
new和malloc的区别是什么?malloc的底层实现是怎样的?- 指针与引用有什么区别?如何相互转换?
static的用法(定义和用途)是什么?const常量和#define的区别是什么?volatile的作用和用法是什么?- 多态实现的三个条件、实现的原理是什么?
- 析构函数一般写成虚函数的原因是什么?
- TCP、UDP 的区别、优缺点与适用场景?
- 什么是三次握手?为什么不能二次握手?
- 什么是四次挥手?为什么客户端最后还要等待 2MSL?
- 堆和栈的区别是什么?什么是内存泄漏和内存溢出?
- 死锁的原因、条件是什么?如何创建和预防死锁?
- 中断和异常的区别是什么?中断处理大概流程?
- 大小端的区别以及各自的优点,什么时候用?
- I²C 的时序是怎样的?上拉输入、推挽输出、开漏输出有什么区别?
- 虚拟内存是什么?虚拟地址与物理地址如何转换?
《参考解析》
这份清单的价值在「按章扫盲」,不在逐题背答案。 六章对应嵌入式面试的六个面:进程线程(操作系统基础)、C/C++(语言与内存)、网络(TCP/IP 与 socket)、算法与 STL、Linux(内核、驱动、系统调用)、单片机(外设、总线、中断)。准备时先按目标岗位定权重:应用开发偏进程线程、网络、Linux 系统调用;驱动偏内核同步、字符设备、设备树;MCU 偏中断、外设、RTOS。每章挑 5~8 道能讲到「为什么」的题,剩下的知道结论即可,别把 111 道全背成名词解释。
进程与线程:资源分配 vs 调度单位。 进程有独立地址空间、文件描述符表、信号处理等资源;线程共享进程的地址空间和资源,只有独立的栈、寄存器上下文和线程局部存储。进程隔离好、崩溃不影响彼此,但创建/切换/通信成本高;线程轻量、共享数据方便,但要自己处理竞态和锁。多进程通信用管道、消息队列、共享内存、信号、socket;多线程通信用互斥锁、条件变量、信号量、读写锁、原子操作。同步不一定阻塞(自旋锁、原子操作不睡眠),阻塞也不一定同步(等 IO 是阻塞但未必涉及共享数据)。
C/C++:static、volatile、new/malloc 是高频三件套。 static 在局部变量上改变生命周期,在全局变量/函数上改变链接属性(只在本编译单元可见);volatile 只保证每次访问内存、不保证原子性和顺序;const 是编译期只读约束,#define 是预处理文本替换,前者有类型检查、可调试。new 会调用构造函数、失败抛异常,malloc 只分配原始内存、失败返回 NULL;new[] 要配 delete[]。多态三条件:继承、虚函数重写、父类指针/引用指向子类对象;底层是虚函数表 + 虚表指针,析构函数写成虚函数是为了通过基类指针删除派生对象时能调到派生析构,避免资源泄漏。
网络:握手与挥手的「为什么」比流程更重要。 三次握手是为了让双方都确认「自己的发送和接收能力正常」,并同步初始序列号;两次不够,因为服务端无法确认客户端收到了自己的 SYN。四次挥手是因为 TCP 全双工,两个方向要分别关闭;客户端最后等 2MSL,是为了让最后一个 ACK 有时间到达、并让旧连接的重复报文在网络中消失,避免污染新连接。TCP 可靠靠序列号、确认、重传、流量控制、拥塞控制;UDP 无连接、开销小、适合实时音视频和 DNS 这类能容忍丢包的场景。
堆栈与死锁:一个讲内存,一个讲并发。 栈由系统自动管理、存放局部变量和调用上下文,空间小、分配快;堆由程序员申请释放,空间大、分配慢、易碎片。死锁四条件:互斥、占有并等待、不可剥夺、循环等待;破坏任一即可,工程上最常用的是固定加锁顺序、超时重试、缩小临界区、避免嵌套锁。中断与异常:中断是异步的外部事件,异常是同步的 CPU 内部事件(缺页、除零、非法指令);中断处理要短,耗时逻辑下放到底半部/任务。