华测导航嵌入式软件秋招一面:C 与 Linux 基础
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- C 语言中的局部变量、全局变量和动态申请内存分别存储在哪里?
- 进程和线程有什么区别?为什么嵌入式程序中经常使用线程?
- Linux 中常见的进程间通信方式有哪些?分别适用于什么场景?
- 什么是死锁?死锁产生的必要条件是什么?如何处理?
- TCP 和 UDP 的核心区别是什么?如何选择?
- AI 模型部署到客户端时为什么要量化?常见量化方式有哪些?
- 当前模型推理成功率只有 75%,你会如何继续提高?
- 请做一下自我介绍。
- 你什么时候能入职?
- 你对嵌入式软件工程师这个岗位的理解是什么?
- 请介绍一个你负责过的项目,以及你在其中解决的关键问题。
- 请介绍一次比较复杂的系统设计经历,你在其中承担什么角色?
《参考解析》
C 语言的内存分区
局部变量在栈上:函数调用时建立栈帧,返回即释放,分配回收快但空间有限,所以不能在栈上开超大数组,也不能返回局部变量的地址。已初始化的全局变量和静态变量在 .data 段,未初始化或初始化为零的在 .bss 段(只占大小、不占文件空间),字符串常量和只读数据通常在 .rodata 段,代码在 .text。malloc / calloc / realloc 得到的内存在堆上,生命周期由程序员控制。工程上比「分在哪」更重要的是随之而来的问题:内存泄漏、重复释放、释放后继续使用、越界写和内存碎片。嵌入式里长期运行的程序尤其要避免频繁申请大小不一的块,常用固定大小内存池替代。
进程与线程,以及 IPC 怎么选
进程是资源分配的基本单位,拥有独立的虚拟地址空间和文件描述符表;线程是 CPU 调度的基本单位,同进程内线程共享代码段、全局变量、堆和 fd,各自有独立的栈与寄存器上下文。进程隔离好、一个崩了不直接毁掉另一个,但切换和通信开销大;线程通信快,但共享数据必须配互斥锁、读写锁、原子变量、条件变量或无锁队列,否则就是数据竞争和死锁。嵌入式程序用线程主要是为了把采集、处理、通信、存储解耦,避免一个耗时操作卡住整个主循环,同时利用多核并按优先级满足实时性。IPC 选型可以按数据特征摊开:管道和命名管道适合简单字节流;消息队列保留消息边界,适合控制命令和结构化小数据;共享内存性能最高但本身不提供同步,要配信号量、进程共享互斥锁或 futex;Unix Domain Socket 适合本机双向通信,接口与网络 socket 一致,还能传文件描述符;信号只适合异步通知(退出、重载配置),不适合传数据。如果是采集进程给算法进程传大尺寸图像,通常用共享内存或 DMA-BUF 加事件通知,避免大块拷贝。
死锁:四个必要条件与工程处理
死锁是多个线程或进程互相等待对方持有的资源,导致所有参与者都卡死。四个必要条件必须同时成立:互斥、占有且等待、不可剥夺、循环等待——破坏其中任意一个就能避免。工程上最有效的是统一加锁顺序(破坏循环等待),其余手段包括缩短持锁时间、不在持锁状态下做阻塞操作(IO、等待子线程)、用 trylock 或带超时的锁、把共享资源改成消息传递或单线程串行管理;排查时用 gdb / pstack 抓线程栈看谁在等谁,或用死锁检测工具。要提醒的是加锁顺序约定必须全项目遵守,只要有一处反着来,循环等待就可能在线上偶发出现。
TCP 和 UDP 怎么选
TCP 面向连接、可靠有序,有重传、流量控制和拥塞控制,代价是队头阻塞——前面丢的包没到,后面已经到达的数据也不能交付给应用;UDP 无连接,不保证可靠、顺序和不重复,开销小、延迟低,适合实时音视频、广播发现、传感器数据这类「宁可丢一点也不等」的场景。要在 UDP 上做可靠传输,就得自己在应用层实现序列号、确认、超时重传、去重和流控。选型看的不是谁快,而是:能不能接受丢包和乱序、单条消息大小是否固定、网络抖动是否影响业务、是否需要广播组播、丢包后的恢复成本有多高。
端侧推理为什么要量化
量化把浮点参数和计算换成低比特整数表示,直接收益是模型体积变小、内存带宽和算力需求下降,从而在端侧更快、更省电,也能用上硬件的整数加速单元。常见分类可以从几个维度看:按对象分权重量化、激活量化或两者都量化;按时机分训练后量化(PTQ,简单但可能掉点)和量化感知训练(QAT,训练时模拟量化误差,精度更好但成本高);还有混合精度,对敏感层保留高精度。对称 INT8 量化用 q = round(x / scale),反量化 x ≈ q * scale;非对称还要加零点 q = round(x / scale) + zero_point。真正影响效果的是校准:如果少量异常值把量化范围撑得太大,正常数据的有效精度会被压缩,所以要用有代表性的校准集,并逐层对比精度损失,而不是只看最终准确率。模型成功率不达标时,也先分清指标定义(分类准确率、召回率还是端到端业务成功率),再拆数据、模型、部署三类原因,最后用独立测试集和线上采集数据验证,避免过拟合到验证集。