2022-07-11 BUD元宇宙面试记录及复盘(还是要多复习下语言的细节)

还不知道面试结果

面试流程

  1. 自我介绍
  2. 语言层面的细节
  3. 项目经历
  4. 提问

倒是没让做算法题

语言层面

map是并发安全的吗

那肯定不是,map在写的过程中会检查标志位,如果有其他协程在写,会直接panic。日常开发过程中也经常看到这个panic。

map可以在遍历的时候删除吗

答:不可以,会遇到并发读写的panic
问:那如果是单协程呢?(问的有点东西,我楞了一下)
答:那应该可以(我不太确定,确实有点记不清了,实际上是可以的,但是从防御式编程的角度讲,不管语言支不支持这样做都不太好)
问: map删除key之后会理解清空,删除这块占用的内存吗?
答: 不会,会先写标志位,后续再进行删除。删除时会检查当前是否符合缩容的阈值,达到阈值进行缩容(可以,有点深度,问的我一愣一愣的,仔细回想了下相关知识点,但其实说的不完全对)

关于删除流程的官方答案

  1. 检测是否存在并发写操作
  2. 计算key的hash值,找到落入的bucket
  3. 设置写标志位
  4. 检查次map是否在扩容的过程中,如果是则直接触发一次搬迁操作
  5. 两层循环,核心是找到key的具体位置,寻找过程都是类似的,在bucket中挨个cell寻找
  6. 找到对应位置后,对key或value进行“清零”操作
  7. count–,将对应位置的tophash值设置成emptyOne
  8. 检测此槽位是否都为空,若是将tophash改成emptyRest
  9. 若上一步成功,则进一步扩大战果,将此cell之前的tophash值为emptyOne的槽位都设置成emptyRest

channel的底层结构

我傻了,一点印象都没,所以换了一个问题

GMP调度模型了解吧,有缓冲的channel满了之后,GMP现在是一个什么样的状态

答:这要分两个场景来看,读和写,读没啥好说的,一直在消费。写的话因为缓冲区满了,会写不进去,这时候写协程g会堵塞,因为这类阻塞不是系统调用(我不太确定)。所以对应的m实际上不会阻塞,m可以去处理其他事情,例如帮忙消费队列信息,等队列有空位之后,再对这个g进行唤醒
答的时候我是有点懵的,gmp我还能掰扯两句,但是绑了一个实际案例,我心里就有点打鼓,我感觉我说的基本没错,就是阻塞时候是不是系统调用不太确定,后面查了一下,应该是这样的:满了之后会再次构建一个g,把g加到待发送队列,直接就挂起等待唤醒。感觉跟我说的差不多。

写在最后

后面就是项目经历了,就不说了。这么一复盘下来感觉还行?但是中间有一次换问题的操作,最终结果还是不太确定。
西巴

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值