面试经历--蚂蚁金服篇
背景
八月份开始了蚂蚁金服的面试,岗位还是编译器虚拟机相关的。
第一轮面试
全程电话面试,大概半个小时到四十分钟左右的时间。
自我介绍
常规流程,从自我介绍开始,讲了下自己的工作项目经历。着重编译器后端的工作,提了一嘴WASM。
ARM 的函数调用约定
只回答了下参数传递的方式(寄存器和栈),寄存器保存和恢复和Bl指令。
Debug用到的二进制工具
提下objdump,应该还readelf,link等。
ARM 链接器重定位的方式
重定位的分类,只是说二进制地址的计算,感觉没答到点子上,后来提了下函数调用需要的函数表。应该回答下相对地址和绝对地址的。还有VM中对地址重新编码的。
WASM 和 Java Byte Code、汇编 的比较
没回答好。把 JBC和DEX IR混淆了,JBC和WASM一样是栈式的,DEX IR是寄存器式的。
遇到的难题和解决方法
说了下调度优化的事情。
内核锁的种类和对应的使用场景
只说了spin_lock,还有mutex,信号量 和 临界区。
WASMJIT的原因
七七八八地说了一些。应该简单讲,觉得性能会好一点。
提问
问了下对应的岗位情况。
整体回答的一般,相对之前有条理一些了。但是做过的事情还是没讲好,后面在写写。二面争取争取。
第二轮面试
电话面试,面试了将近一个小时。面试官可能偏编译器方向的,问了许多编译器方向的问题,都是些比较实际的技术问题。
自我介绍
还是按时间线讲了下自己做过的东西。
CPU体系结构的问题
因为是编译器后端,会了解一些体系结构的东西。所以问了这方面的知识点。但问的是x86和arm的内存模型差异点,比较出乎意料,目前不了解内存模型相关的知识,好像是强内存序和弱内存序的区别;
arm64和arm32指令集的区别,指针长度不一样,数据长度不一样。其它的没想出来。
编译优化的问题
循环优化,如何找到优化点,有哪些方向可以优化。用perf看性能点,方法有循环展开,常规的冗余消除。面试官补充了指令向量化,data cache优化。
链接和动态加载
主要是针对ELF文件格式,如何动态加载和链接。没答上。
WASM 的设计理念
wasm这边主要是问四个特性,安全,快速,可移植。为了实现这些特性做了哪些设计?没了解太清楚,LEB128的压缩编码减少体积,结构化控制流减少非规约循环等。主要是WASM论文里的东西。
maple的Java栈与C++栈有和不同
maple的栈基本与native栈类,只是多了些分区来储存变量。
指令调度
算法如何实现的,介绍了下List Scheduling、三个主要约束、denpendence建立和寄存器压力。做了哪些事情,提了机器模型和latency计算。为什么做指令调度,硬件上有乱序功能了,因为小核是In-Order的,所以只能软件上实现。
提问
如何学习编译器虚拟机。面试官答,编译器知识不是为了编译器专门学,而是可以把这些东西用到AI等新兴领域。
这轮面试,面试官按简历上的项目分大类进行提问,感觉问的问题比较常规,小问题比较多,面完很久了,有些问题没记住了。这轮面试主要问题是知识点都比较碎片化,没有系统性的总结。
第三轮面试
这轮面试比较短暂,二十分钟左右。
自我介绍
WASM 的特性
跟上轮问题相识。
ELF GOT和PLT区别
重定位的作用,区别没答上来。
变更岗位的看法
面试官假设是否可以去做Android相关的岗位。不太想去。
为啥换工作,驱动和编译器差别还是有的。
刚好有机会,对基础软件也都有兴趣,前家学不到东西。
提问
不想问问题了。
这轮面试问题跟上轮的一些题目相识度比较高,都是些大方向的问题,个人积累不深,没说两句,面试官看回答得不怎样也就没继续问了。
第四轮面试
感觉有点面试不动了,也是二十分钟左右的面试时间。终于没有自我介绍了。
主要做了哪些驱动模块
LCD和Audio。
LCD方面遇到了哪些问题,如何解决
花屏问题概率性的比较难解决。一般思路,看log->测试时序->硬件分析。
Android framework-hal-内核通信机制
不懂。
Android驱动下实现的进程通信的方法
binder,但原理没清楚。
为何要有hal
Linux协议限制,隔离硬件。
framebuffer机制原理
不记得了。
设备驱动模型
只记得 device-bus-driver的概念。
做wasm虚拟机的原因
有跨平台需求。
WASM虚拟机的性能
WASM jit遇到困难的问题
控制流指令的翻译,涉及到多层block间不可达指令的跳过问题。
编译器后端遇到比较难的问题和解决思路
arm32栈帧布局的修改,先实现简单的,在逐步演进。
后端代码的问题和改进点
没有分层设计,移植比较困难。
线程和进程的区别
线程间数据共享。数据结构上的区别答不上来。
提问
不想问问题了。
这轮面试,主要就问解决问题的思路。到了基础性的问题没回答,估计被判了基础能里不行吧,然后面试就结束了。此次驱动方向的东西都没答好,基本都还回去了,主要还是做过的东西没有整理成文档,导致基本被遗忘了。操作系统的东西要重新学习下了。
总结
这次面试,轮次比较多,把知识漏洞暴露的一干二净。后续系统性的学习和总结做过学过的东西,然后是对于一些问题要有自己的思考,最后是操作系统进程调度,资源竞争和锁等要重新学习,把操作系统重新看一下。