众安 golang 后台开发笔试复盘

  • 选填考了一堆计网相关的八股,已晕。

  • Mutex 的正常模式和饥饿模式的区别,是为了解决什么问题?

    写屏障(Write Barrier)是 Go 在进行并发垃圾回收时,在指针写入操作前插入的一段额外逻辑,用于记录对象引用关系的变化。由于 Go 的 GC 采用并发标记算法,在 GC 标记阶段用户程序仍然可能修改对象指针,如果没有写屏障,可能导致某些新引用的对象没有被标记,从而被错误回收。写屏障的作用就是在指针发生变化时通知 GC,将相关对象重新标记为可达,从而保证并发 GC 过程中对象引用关系的正确性,避免出现误回收的问题,本质上是解决并发标记阶段的数据一致性问题。

  • GC 过程中的写屏障是什么,作用是什么?

    写屏障(Write Barrier)是 Go 在进行并发垃圾回收时,在指针写入操作前插入的一段额外逻辑,用于记录对象引用关系的变化。由于 Go 的 GC 采用并发标记算法,在 GC 标记阶段用户程序仍然可能修改对象指针,如果没有写屏障,可能导致某些新引用的对象没有被标记,从而被错误回收。写屏障的作用就是在指针发生变化时通知 GC,将相关对象重新标记为可达,从而保证并发 GC 过程中对象引用关系的正确性,避免出现误回收的问题,本质上是解决并发标记阶段的数据一致性问题。

  • 内存逃逸的定义是什么?请举出几处常见的内存逃逸的情景。为什么要尽量避免内存逃逸的出现

    Go 的 sync.Mutex 采用正常模式和饥饿模式两种工作模式来平衡性能和公平性。在正常模式下,新来的 goroutine 可以和等待队列中的 goroutine 一起竞争锁,这样可以提高系统吞吐量,但可能导致某些等待时间较长的 goroutine 一直抢不到锁,从而发生饥饿问题。当某个 goroutine 等待锁超过约 1ms 时,Mutex 会进入饥饿模式,此时锁会按照 FIFO 顺序直接交给等待队列头部的 goroutine,新来的 goroutine 不再参与竞争,从而保证公平性。因此这两种模式的设计主要是为了解决高并发场景下锁竞争的性能与公平性之间的平衡问题。

  • 讲一下 GMP 模型,什么是任务窃取机制,什么是切换机制。

    Go 的 GMP 调度模型由 G(goroutine)、M(操作系统线程)和 P(processor)组成,其中 G 是待执行的协程,M 是实际执行代码的线程,P 是调度的核心资源,负责维护本地运行队列和执行上下文,只有 M 持有 P 才能运行 G。任务窃取机制是指当某个 P 的本地运行队列为空时,会从其他 P 的队列中窃取一半的 goroutine 来执行,以提高 CPU 利用率并实现负载均衡。切换机制主要指当一个 M 因为系统调用(syscall)发生阻塞时,会主动释放绑定的 P,让 P 绑定到其他空闲的 M 上继续执行其他 goroutine,等阻塞的 M 恢复后再尝试重新获取 P,这样可以避免因为线程阻塞导致整个调度器停顿,从而提高并发执行效率。

  • 笔试两题。

    • T1 求 n () 求有多少个数 x 满足

        $\sqrt n$ 筛一下因数就行。
      
    • T2 小红的树,现在有一颗树,小红在 x 节点上,树上的边为双向边,有长度 w,小红可以到一个节点,每次移动需要消耗 w * y 的代价,然后总得分为移动的代价,加上最后停留的位置中,所有节点到该节点的路径长度之和乘以 z,求最小代价。

        换根 DP 
      
#我的求职总结#
全部评论

相关推荐

评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务