ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Go 面试突击:context、GMP、Channel 与 Goroutine 灵魂拷问

Go 面试突击:context、GMP、Channel 与 Goroutine 灵魂拷问 Go 面试突击context、GMP、Channel 与 Goroutine 灵魂拷问Goroutine 一旦泄漏就是生产的灾难。本文从 runtime 原理到实际泄漏案例帮你无悬念走过 Goroutine 面试关。一、GMP 与 GoroutineQ1. 什么是 GMPG goroutineM machineOS threadP logic processor调度单位。Q2. GOMAXPROCS 如何设置runtime.GOMAXPROCS(n)默认 NumCPU。Q3. 协作调度与抢占调度区别协作goroutine 主动让出抢占sysmon 强制。Q4. sysmon 干什么后台线程监控 GC / P / sys 调用。Q5. goroutine 占多少内存初始 2KB栈可动态扩缩。Q6. goroutine 是用户态线程还是内核态用户态线程但由 Go runtime 调度到 OS thread。Q7. 1.14 之前的调度有什么缺点长 goroutine 不可抢占syscall 阻塞时整个进程卡。二、Goroutine 泄漏Q8. 什么是 goroutine 泄漏goroutine 永久 block导致内存泄漏。Q9. 4 种常见泄漏原因channel 写没人读lock 永久持有long-time select with no defaultctx 忘掉 cancelQ10. 如何发现 goroutine 泄漏gofunc(){import_net/http/pprofhttp.ListenAndServe(:6060,nil)}()/debug/pprof/goroutine显示所有。Q11. 主 goroutine panic 会怎样整个进程崩溃。Q12. 子 goroutine panic 会怎样子 goroutine 死。主 goroutine 用 defer recover 可以兜底但必须每个 goroutine 都 recover 或使用 errgroup。三、Channel 灵魂拷问Q13. Channel 状态机G Idle → Runnable (runqueue) → Running → Waiting → Runnable…Q14. Channel 是阻塞的吗有缓冲且未满不阻塞无缓冲或满则阻塞。Q15. Channel close 后再写会怎样panic。Q16. Channel close 后再读可读到剩余值若空返回零值okfalse。Q17. Channel 是 buffer 还是 syncbuffer 是容量sync 自动阻塞。Q18. select 随机是为了什么避免饥饿让所有 channel 等公平。Q19. nil channel 是死路永远不会 readyselect 跳过 case。Q20. 多个 ctx 取消是二级管道吗ctx 树会把下游全部 cancel。四、Context 高级Q21. ctx.Done() vs ctx.Err()Done 是 channelErr 是错误原因。Q22. context.Value 性能map 查找约 20ns数据量大性能下降。Q23. value 推荐放什么request id / user id 等只读元数据。Q24. value 不推荐放什么可变数据、数据库连接等。Q25. 为什么 ctx 要 defer cancel()资源回收ctx create 了一个 timer 和 channelcancel() 立即清理。五、实战题Q26. 多 goroutine 共写一个 map 的解决方案sync.Mutex / sync.RWMutex / sync.Map。Q27. atomic 与 Mutex 区别atomic 用 CPU 指令mutex 系统调用。atomic 快。Q28. goroutine 池该怎么实现固定 worker 协程 任务 channel。typePoolstruct{chchanfunc()}funcNew(nint)*Pool{p:Pool{ch:make(chanfunc(),n)};fori:0;in;i{gop.worker()};returnp}func(p*Pool)worker(){forf:rangep.ch{f()}}func(p*Pool)Submit(ffunc()){p.ch-f}Q29. 如何优雅停机signal.NotifyContextsrv.Shutdown(ctx)。Q30. Goroutine 遇上 OS thread 切换G 通过 M 关联 OS threadP 决定多少个 M 同时运行。六、总结与展望Goroutine 是 Go 的核心Context 则是它与外部世界沟通的桥梁。掌握 GMP 调度、Channel 语义、Context 链是 Gopher 含金量最高的知识。未来面试可能会考察高并发 goroutine 调度器调度器优先级、调度公平性与 ServiceMesh 的联动七、参考文献Go runtime 源码pkg/errgroup 文档
返回列表