面灵AI→

优必选机器人 C++ 二面:Orin 图像拷贝与 EtherCAT 实时通信

轮次
二面
时间
2026-10
来源
牛客网

《面试题目》

  1. 讲解一下项目和实习经历。
  2. Orin AGX 中 CPU 和 GPU 是硬件资源共享,为什么有时候还需要图像预处理来减少拷贝?
  3. 智能指针的用法和内部机制?
  4. 用过哪些 STL 容器,介绍下各自的用法?
  5. 一般怎么排查内存泄漏问题?
  6. 如何查看 Linux 中的 CPU 占用情况?
  7. EtherCAT 和 CAN 有什么区别,为什么 EtherCAT 更快?
  8. 进程间通信有哪些方式,IO 模型用过吗?
  9. 了解哪些机器人通信中间件?

《参考解析》

Orin 图像预处理与拷贝开销:Orin AGX 的 CPU 与 GPU 共享物理内存,「共享」不等于零成本:GPU 访问映射过来的普通页内存要做地址转换与驻留,带宽远低于本地显存,统一内存首次访问还会触发缺页搬移。先把缩放、去畸变、颜色转换、ROI 裁剪做完再送推理,能把搬运字节数降一个数量级;工程上尽量在 GPU 或 VIC 等硬件单元上处理,用 pinned 内存、cudaHostAllocMapped、DMA-BUF/NvBuffer 传递句柄,避免 host→device→host 的往返。要减少的是搬移次数与字节数,而不是共享内存本身。

智能指针的用法与内部机制:unique_ptr 独占所有权,只能移动不能拷贝,大小就是一个指针,析构直接调删除器,应作为默认选择。shared_ptr 是对象指针加控制块,控制块存强/弱引用计数和删除器,计数用原子操作,拷贝加一、析构减一,强计数归零销毁对象、弱计数归零才释放控制块,所以 sizeof 是指针的两倍。weak_ptr 不增计数,用于打破循环引用,用前 lock()。注意计数线程安全,被指对象本身不是;make_shared 一次分配更 cache 友好,但对象内存要等弱引用清空才归还。

内存泄漏排查:先分清「真泄漏」还是「内存一直涨」,用 top、/proc/<pid>/status 的 VmRSS 和 smaps 看增长曲线,配压测反复走同一路径观察是否单调上升。工具分三层:Valgrind memcheck 给调用栈但很慢,适合小用例;ASan/LSan 插桩开销可接受,适合单测联调;tcmalloc heap profiler 或 gdb 抓堆栈适合线上长跑进程,按分配点聚合看谁在涨。还要区分泄漏与「容器只增不减」的业务问题。根治靠 RAII 与智能指针,避免裸 new,最后把复现用例沉淀成回归。

EtherCAT 与 CAN 的差异:CAN 是总线型多主仲裁,典型 500K~1Mbps,单帧有效载荷最多 8 字节,节点一多带宽和实时性就吃紧。EtherCAT 走标准以太网物理层,100Mbps 全双工、主从结构:从站用 ESC 芯片在报文经过时「边转发边读写」,一帧可携带多个从站数据,带宽利用率极高;再加分布式时钟做亚微秒同步,适合多轴伺服、关节控制这类高同步、小数据、强周期场景。它更快不只靠速率,更关键是报文利用率与硬件转发带来的确定性。