记一次字节分布式存储的三面(已OC)
再更新:4月11日hr面,4月13日oc。为字节的推进速度点赞。
更新:等了一天半后约hr面了。
因为一面二面都比较顺利,所以这次三面坦白来讲是有一些飘的,不过三面面试官给我上了一课。
首先是交流了一个6.828中最困难的部分。我说了一下中断和fork那两个lab,中间涉及到的汇编我想做过lab的都知道有多麻烦,调试上也很费力气。
然后是开始问一些知识:
1.知道什么是抢占式和非抢占式内核嘛?(常规八股)
2.怎么保证抢占式的?(常规八股)
3.非抢占式的锁知道不知道?不知道,好,你现场来设计一下吧。(非抢占式的内核支持竞争区嘛?他意思不支持?那我锁了个寂寞?设计了一个值为1代表锁住,值为0代表没锁住,由线程自己决定。)
2.怎么保证抢占式的?(常规八股)
3.非抢占式的锁知道不知道?不知道,好,你现场来设计一下吧。(非抢占式的内核支持竞争区嘛?他意思不支持?那我锁了个寂寞?设计了一个值为1代表锁住,值为0代表没锁住,由线程自己决定。)
然后又问我为什么要有非抢占式的锁?瞎扯锁住某些内存区域
4.接下来是高端内存区域是什么地方?用来干什么的?然后问我访问高端内存区域会发生什么?我说触发异常进内核态然后找对应函数去处理。为我为什么能够触发异常,想了想觉得应该是由页表项的后12位中有具体的权限门,锁死了用户态的访问。
接下来问了我6.830数据库并发的思路,然后说考察一个类似的设计吧。
5.设计并发的hash表。
大意了,从没看过concurrentHashMap,只能根据自己之前有限的并发经验来现场想。想了想首先分成读锁和写锁,以及锁升级,读锁升级为写锁。
面试官不太同意这个方法。仔细想一想还有什么能借鉴的。然后想到了B+树的螃蟹协议是以叶子节点为单位锁的。于是尝试着说锁具体的bucket。这下子ok了。
6.rehash的时候,A是原有的桶,把Arehash到B,C桶,给谁上锁?盲猜了一把BC,后A。问我为啥?答不出来。最后反问告诉我说确实是BC,原因是hash可见性,这个我是真的不知道。
7.topk问题。好吧,我只会堆和快速选择,就把这两个都过程都说了一下。
6.rehash的时候,A是原有的桶,把Arehash到B,C桶,给谁上锁?盲猜了一把BC,后A。问我为啥?答不出来。最后反问告诉我说确实是BC,原因是hash可见性,这个我是真的不知道。
7.topk问题。好吧,我只会堆和快速选择,就把这两个都过程都说了一下。
此时已经过了40分钟,然后面试官说没什么问的了。开玩笑和面试官说这次面试很chanllage,面试官说优秀的面试还是要问到你不会的地方为止。最后说3天内尽快给反馈。ps:这个时候已经是晚上8:40了,而且也没做什么算法题。大概率是凉了。
整体而言这次面试是比较难的,会抛出一个又一个问题让你现场想,比较考察基本功吧。想了想这些题目还是很有借鉴意义的,发出来和大家共勉。