由于面试官前几天 🐏 了,在 HR 面后补了技术二面,不过问得倒也不难,但还是记录下。
1、请做 3 ~ 5 分钟的自我介绍。
2、你说研究生的方向是漏洞挖掘和模糊测试,可以介绍一下吗?
3、简单介绍下缓冲区溢出漏洞,如何挖掘此类漏洞?如何利用此类漏洞进行恶意攻击?Linux 的避免缓冲区溢出漏洞的工具有了解吗?
4、说一下数据库的隔离机制。
脏读(即读到未提交的数据)、不可重复读、幻读和串行化(Serializable)。
5、不可重复读和幻读的区别是什么?
这个问题很高频,也很难答好,参考知乎回答,捋一捋这个问题。
(1)不可重复读 是读到已提交的数据,只不过这个数据每次都不一样,侧重于对数据的修改。如事务A,多次读表中的工资数据,但另一边事务B给某位员工涨工资了,导致事务A每次读到的数据都不一样。还有对数据的删除,如事务B将某位员工的工资数据删除,也会导致事务A读到的数据不一致,删除也可以归类到不可重复读。
(2)幻读 侧重于对数据的插入。幻读执行相同的查询语句是可以重复读到一致的数据的,但对插入的新数据就无可奈何了。例如,计算所有员工工资时,事务B插入一条新工资数据,事务A查询不到,但事务A在计算总工资的时候,发现总和变多了,这就见了鬼(phantom)了。
为啥要区分这两种情况呢?因为在数据库管理机制上,对这两种情况的解决方法是不同的。
对于不可重复读,只要加上行级锁即可,给已提交的每行数据上锁,一个事务在读的时候,不允许另一个事务操作该行数据。
但对于幻读,新的数据行是之后插入的,连这行数据都没有,更谈不上行级锁,因此需要采取新的锁机制,即加间隙锁。
6、如何避免幻读?
🔒 加间隙锁。
7、TCP 里怎么做流量控制?或者更普遍一点,对于流量控制可以有哪些做法?
TCP 中的流量控制是接收方根据其滑动窗口的大小,告知发送方剩余的可接受空间(接收窗口的大小),然后发送方根据该通知确定发送报文的大小。
8、TCP 有三次握手和四次挥手,为什么挥手多了一次?
因为挥手时存在一个半关闭状态。例如,客户端发起断开连接请求,服务器应答请求后进入半关闭状态,此时服务器还能向客户端发送未发完的消息,但客户端已经无法发送消息只能接受消息。服务器发完所有消息后,也向客户端发起断开连接请求,这里多了一次挥手。
9、聊聊你用过的技术栈,使用过哪些数据库?
Web 框架 Spring MVC,Spring Boot,Iris。数据库的话是 MySQL、SQLServer。消息队列 RabbitMQ,缓存中间件 Redis。
10、说一说 Redis 的数据结构?我开始说了跳表,面试官说那是内部的实现。Redis 面向使用者的数据结构有哪些?
String:字符串类型;List:列表类型;Set:无序集合类型;ZSet:有序集合类型;Hash:哈希表类型
11、Redis 有哪些应用场景?
八大应用场景:
(1)缓存,减小数据库的压力;(2)排行榜;(3)计数器,如文章浏览量 + 1;(4)分布式会话;
(5)分布式锁;(6)社交网络,如关注、点赞、共同好友等;(7)最新列表;(8)用作消息队列。
12、Redis 既然可以作为缓存,那么说一说缓存的局部性原理。
包括 时间局部性原理 和 空间局部性原理。
时间局部性原理:若程序中的某条指令被执行,则不久之后该指令可能被再次执行;若某数据被访问,则不久之后该数据可能被再次访问。举例:for 循环。
空间局部性原理:若程序访问了某个存储单元,则不久之后,其附近的存储单元也将被访问。举例:数组结构。
13、聊聊你在滴滴 🚕 的实习(大概 10 分钟)。
14、算法思维题:蚂蚁爬绳,一根绳子左右两端各有若干蚂蚁相向爬行,两只蚂蚁相向碰撞后各自掉头,直到全部蚂蚁爬出绳子,求一共发生多少次碰撞后所有蚂蚁爬出绳子(未写代码)。面试官提示用分治思想,我用了数学归纳法 😅。
结果:若左侧有 m 只蚂蚁,右侧有 n 只蚂蚁,则需经过 m×n 次碰撞后,所有蚂蚁才能爬出绳子。
追问,左侧头部的这只蚂蚁需要经过多少次碰撞才能出绳子。
15、问了对未来的职业规划,是做后端?测试?还是走安全?
16、问了成绩排名和保研清华的流程。
17、经典反问环节。