面试经历--蚂蚁金服篇

背景

八月份开始了蚂蚁金服的面试,岗位还是编译器虚拟机相关的。

第一轮面试

全程电话面试,大概半个小时到四十分钟左右的时间。

  1. 自我介绍

    常规流程,从自我介绍开始,讲了下自己的工作项目经历。着重编译器后端的工作,提了一嘴WASM。

  2. ARM 的函数调用约定

    只回答了下参数传递的方式(寄存器和栈),寄存器保存和恢复和Bl指令。

  3. Debug用到的二进制工具

    提下objdump,应该还readelf,link等。

  4. ARM 链接器重定位的方式

    重定位的分类,只是说二进制地址的计算,感觉没答到点子上,后来提了下函数调用需要的函数表。应该回答下相对地址和绝对地址的。还有VM中对地址重新编码的。

  5. WASM 和 Java Byte Code、汇编 的比较

    没回答好。把 JBC和DEX IR混淆了,JBC和WASM一样是栈式的,DEX IR是寄存器式的。

  6. 遇到的难题和解决方法

    说了下调度优化的事情。

  7. 内核锁的种类和对应的使用场景

    只说了spin_lock,还有mutex,信号量 和 临界区。

  8. WASMJIT的原因

    七七八八地说了一些。应该简单讲,觉得性能会好一点。

  9. 提问

    问了下对应的岗位情况。

整体回答的一般,相对之前有条理一些了。但是做过的事情还是没讲好,后面在写写。二面争取争取。

第二轮面试

电话面试,面试了将近一个小时。面试官可能偏编译器方向的,问了许多编译器方向的问题,都是些比较实际的技术问题。

  1. 自我介绍

    还是按时间线讲了下自己做过的东西。

  2. CPU体系结构的问题

    因为是编译器后端,会了解一些体系结构的东西。所以问了这方面的知识点。但问的是x86和arm的内存模型差异点,比较出乎意料,目前不了解内存模型相关的知识,好像是强内存序和弱内存序的区别;

    arm64和arm32指令集的区别,指针长度不一样,数据长度不一样。其它的没想出来。

  3. 编译优化的问题

    循环优化,如何找到优化点,有哪些方向可以优化。用perf看性能点,方法有循环展开,常规的冗余消除。面试官补充了指令向量化,data cache优化。

  4. 链接和动态加载

    主要是针对ELF文件格式,如何动态加载和链接。没答上。

  5. WASM 的设计理念

    wasm这边主要是问四个特性,安全,快速,可移植。为了实现这些特性做了哪些设计?没了解太清楚,LEB128的压缩编码减少体积,结构化控制流减少非规约循环等。主要是WASM论文里的东西。

  6. maple的Java栈与C++栈有和不同

    maple的栈基本与native栈类,只是多了些分区来储存变量。

  7. 指令调度

    算法如何实现的,介绍了下List Scheduling、三个主要约束、denpendence建立和寄存器压力。做了哪些事情,提了机器模型和latency计算。为什么做指令调度,硬件上有乱序功能了,因为小核是In-Order的,所以只能软件上实现。

  8. 提问

    如何学习编译器虚拟机。面试官答,编译器知识不是为了编译器专门学,而是可以把这些东西用到AI等新兴领域。

    这轮面试,面试官按简历上的项目分大类进行提问,感觉问的问题比较常规,小问题比较多,面完很久了,有些问题没记住了。这轮面试主要问题是知识点都比较碎片化,没有系统性的总结。

第三轮面试

这轮面试比较短暂,二十分钟左右。

  1. 自我介绍

  2. WASM 的特性

    跟上轮问题相识。

  3. ELF GOT和PLT区别

    重定位的作用,区别没答上来。

  4. 变更岗位的看法

    面试官假设是否可以去做Android相关的岗位。不太想去。

  5. 为啥换工作,驱动和编译器差别还是有的。

    刚好有机会,对基础软件也都有兴趣,前家学不到东西。

  6. 提问

    不想问问题了。

这轮面试问题跟上轮的一些题目相识度比较高,都是些大方向的问题,个人积累不深,没说两句,面试官看回答得不怎样也就没继续问了。

第四轮面试

感觉有点面试不动了,也是二十分钟左右的面试时间。终于没有自我介绍了。

  1. 主要做了哪些驱动模块

    LCD和Audio。

  2. LCD方面遇到了哪些问题,如何解决

    花屏问题概率性的比较难解决。一般思路,看log->测试时序->硬件分析。

  3. Android framework-hal-内核通信机制

    不懂。

  4. Android驱动下实现的进程通信的方法

    binder,但原理没清楚。

  5. 为何要有hal

    Linux协议限制,隔离硬件。

  6. framebuffer机制原理

    不记得了。

  7. 设备驱动模型

    只记得 device-bus-driver的概念。

  8. 做wasm虚拟机的原因

    有跨平台需求。

  9. WASM虚拟机的性能

  10. WASM jit遇到困难的问题

    控制流指令的翻译,涉及到多层block间不可达指令的跳过问题。

  11. 编译器后端遇到比较难的问题和解决思路

    arm32栈帧布局的修改,先实现简单的,在逐步演进。

  12. 后端代码的问题和改进点

    没有分层设计,移植比较困难。

  13. 线程和进程的区别

    线程间数据共享。数据结构上的区别答不上来。

  14. 提问

    不想问问题了。

这轮面试,主要就问解决问题的思路。到了基础性的问题没回答,估计被判了基础能里不行吧,然后面试就结束了。此次驱动方向的东西都没答好,基本都还回去了,主要还是做过的东西没有整理成文档,导致基本被遗忘了。操作系统的东西要重新学习下了。

总结

这次面试,轮次比较多,把知识漏洞暴露的一干二净。后续系统性的学习和总结做过学过的东西,然后是对于一些问题要有自己的思考,最后是操作系统进程调度,资源竞争和锁等要重新学习,把操作系统重新看一下。