字节提前批 二面
字节 后端-基础架构Data 二面 8.3晚 大约70min
一、自我介绍
- 为啥之前本科没有实习经历?
- 什么时候毕业?
- 本科学习哪些专业课程?
- C++大一学了之后还用过吗?
- 因为是物联网专业,问有什么硬件知识储备?
- 了解过指令集吗?
- 回答了一条指令执行的过程,说了一下本科计组课设用过verilog实现过单周期CPU和五级流水CPU的仿真,主要实现了MIPS指令集,详细举例了ADD指令和LOAD指令的实现过程。(一个逻辑运算指令和内存I/O指令,其实忘了再距离跳转指令,如JUMP指令,这样回答更好一些,这些都是现场回忆大二做的课设,觉得能讲清楚就已经很好了,面试官也听懂了个大概)
-
- 说一下Cache的原理,为啥要Cache?
- 先回答了内存和cpu之间为啥要cache,说缓存是一种工程思想,其他很多地方都用到了;
-
二、项目(前面自我介绍,专业背景提问大概12分钟)
- 介绍一下做的聊天集群项目
- 可能介绍的比较流畅,面试官问是自己做的项目吗?
- 很实在地回答了是网上开源的项目,然后我赶紧补充了这个项目我的收获(事后觉得自己有点真诚过了头)。
-
- 用到了Nginx,说一下起到了什么效果?
- 项目代码量多少?主要是C++吗?
- 接下来介绍RPC框架项目
- 说了一下rpc原理,然后就是各个模块怎么实现(回答不是太好)
-
- 序列化自己实现要注意什么?
- 参照之前用过的json,protobuf怎么实现序列化的,怎么分字段给用户读到具体的消息内容,怎么存储消息,然后举例了json字符流存储多余的字段名和protobuf的二进制字节流怎么消息分界,当时知道什么说什么,这个答得不好。
-
三、操作系统
- 多线程和高并发场景需要考虑啥问题?
- 往cup密集型和I/O密集型业务讲了业务需要区分,然后区别处理;
- 面试官的意思是侧重多线程怎么同步,然后再具体问了多线程访问共享资源注意什么?
- 共享资源,怎么互斥,我回答加锁;
-
-
- 你知道多少锁?
- 回答了自旋锁,信号量、条件信号实现的原理以及PV操作过程。
-
- 说说信号量怎么实现的?
- 从信号量记录共享资源数量,阻塞队列入手说了一大堆。
-
- 说一说你如何理解操作系统?(代码题写完大概50min,后面又开始提问)
- 从cpu管理、内存管理、文件管理、设备管理大概说了说。
-
- 说一下进程的调度,哪些调度算法?
- 从pcb开始回答,里面存着什么信息,进程如何组织管理(PCB队列),再回答了哪些调度算法。
-
- 说一下进程切换?
- 说了通过内核管理PCB,讲了切换的几种场景(阻塞发生,时间片到)
-
- 内核你是怎么理解的?
- 从OS从单程序到多道程序说为啥出现内核,然后再说了虚拟内存高地址是内核空间(内核程序也需要分配内存来存放指令和数据)
- 进程的控制和进程间通信需要借助内核。
-
- OS以前怎么学的,有什么实验课?
- 实验课实现过一些shell命令,内存分页管理
-
四、代码(前面聊了不到半小时开始做题)
LC622 设计实现循环队列
- 说一下思路,队尾指针和队头指针的作用?
- 判断队列满为啥尾指针要加1?
- LC没刷到过,凭借大二数据结构实现自己实现过循环队列回忆起来的,没说到关键点上。其实就是区分队列空和队列满两种情况不能以front==rear来判断(两种情况这个条件都满足)。
-
五、反问
- 你们用C++具体用来开发什么业务?
- 面试官说了很多,基础架构和硬件打交道多一点所以还有用C语言的,你排斥硬件吗?
- 我继续说之前本科物联网专业的,学过需要硬件相关的课程,嵌入式、微机原理啥的,实验室项目做过的ROS小车集群,加的模块也是先从硬件到软件实现(舵机控制板、还有需要烧写程序的板子),所以不会抵触硬件。
-
-
- 评价一下我今天面试的表现?(三面我不再问这个问题了,一定!)
- 知识面很宽,会的还挺多,问题很坦诚(聊天项目直接说是网上开源的),总体回答都还行。
-
最后总结:
- 项目准备不够充分(RPC项目),完全是围绕项目提问聊天,操作系统问的很多,但不是八股那种问法,全是开放性问题,尽量是知道啥就说啥(小林coding YYDS);
- 感谢本科的课程实验,能在关键时候救命(完全靠回忆还能吹出来)
二面完觉得要凉了,面完晚上九点多;第二天傍晚收到三面通知(8.18,好晚啊!!!)。