社招 小鹏汽车-c++ 自动驾驶岗位的面试记录

小鹏汽车-c++ 自动驾驶岗位的面试(jd在最后)
(原本会议45min,干到了70min+)

0.15min分钟的手撕代码
deleteDuplicates(ListNode* head),删除所有重复数字的节点
问下复杂度是多少-n^2?
如何降下来复杂度?
(用c有点蒙蔽,他提了下c++容器,恍然-set和map是可以的自动排序的,可以降低,很尴尬用c为主c++为辅)

1.敲打简历。
做了哪些工作?
问是代码框架是怎么样的?(实话实话)
问问是如何实现消息队列的?(尴尬,用的现成的ucos接口)
换了一个问题,用来什么技术栈(我常用c的,对这个表示陌生。我说我描述下是如何实现的吧)

2.内核裁剪是这么做的?
(大致说了些,根据内核打印,移除一些模块驱动。精简网络-比如去掉一些ssh,把一些服务往后移动)

3.linux的文件系统说一下,说一下底层原理?比如yaffs的这个管理吧?
(我说我用他们多一点,比如用过哪些类型的fs,这个底层确实接触的不多。有点慌....,不知道怎么回答)

4.调用read函数读取数据,到得到数据,中间过程发生了什么?
(说了个大概:
应用层调用read,引发一个系统调用,cpu从用户模式切换到内核模式,想要参数将会传递给内核
内核会调用参数进行验证
内核验证通过会找到对应文件结构体(file文件)进行查找和定位,通过file文件可以找到节点inode,
闪传驱动读取数据和ecc校验数据
接下里就是数据从内核到用户空间的复制,返回用户空间?)

5.用什么方案去实现状态机机制
(我说了下:通过状态机标志位+轮询方式)

6.说下linux内核的内存管理,他们是怎么管理的?为何要引入虚拟
我提到了进程隔离(内存空间的隔离),访问权限的控制,
图片物理内存显示,实现内存扩展
给开发提供了一个同一的、连续的地址空间,我们不需要关注物理内存的布局和碎片,检查程序开发和内存管理

7.GDB常用哪些指令?如何用GDB调试查找死锁问题?
我讲了lrbsqdp(提前速记了:冷若冰霜驱动盘)这个几个指令的使用
l-list显示10行代码,r-run运行代码,b-break设置断点,s-step单步运行,q-quit推出,d-del删除断点,p-print打印变量。
如何查找:结合top和ps。
通过info threads打印出所有线程的信息,包括id和状态
通过thread id 切换到某一个线程
进行栈回溯,了解栈在做什么
然后用print打印锁信息,查看依赖关系和锁状态

8.智能指针有哪些,哪些使用场景?
三种unique_ptr,shared_ptr,weak_ptr
场景:第一个是希望对资源拥有唯一所有权的时候用;
第二个是希望多个指针共享同一块资源的所有权时,
第三个主要时用于解决第二个可能产生的循环引用问题时用。

9.拷贝构造函数的传入参数,如果不加引用符号会怎么样?
会导致无线递归,最后引发栈溢出

10.多态是怎么实现的?
主要是通过虚函数和指针来实现的。
讲了有编译多态和运行时动态多态(主要讲一下运行多态?)
主要讲了虚函数表和虚函数指针的逻辑

11.出了这个虚函数,还有通过哪些方式实现这个动态多态的过程呢?
function,bind,策略模式。知道,但是记得不多了。

12.反问阶段.

日常用的,主要是用c为主,c++为辅

总体感觉:给自己打个7分吧,听天由命等通知。。
---------------------------------------------------------------------------
职位描述
自动驾驶软件开发高级/资深工程师/专家(Linux/C++方向)
岗位职责:
1、负责自动驾驶相关的新产品软件设计和开发;
2、负责自动驾驶相关的应用和算法软件在新软硬件平台上/新车型上的移植和调优;
3、与各相关团队协作,共同完成自动驾驶产品工程化落地,负责分析和解决遇到的相关软硬件问题;
4、负责现有平台/车型的迭代开发维护。

岗位要求:
1、本科及以上学历,计算机/软件专业,至少3年以上软件开发经验;
2、熟练使用现代C++语言开发(C++11及其以上),熟悉STL并了解其实现原理,能进行多线程编程、网络编程、通信中间件开发;
3、熟悉Linux/QNX,并具备在其上的工程构建、开发、问题定位及解决能力;
4、责任心强,具备优秀的学习能力、独立分析问题和良好的团队沟通协作能力;
5、有基于嵌入式平台的大型应用软件开发经验优先,有自动驾驶产品开发和落地经验优先。
全部评论

相关推荐

爱睡觉的冰箱哥:我都是租小时房面试,一次50
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

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