🚀 3分钟搞懂Go语言协程调度,面试再也不怕被问了!

4 阅读1分钟

🚀 3分钟搞懂Go语言协程调度,面试再也不怕被问了!

Go语言的协程(Goroutine)是它最大的特色,也是面试必问的考点,今天用最通俗的话给你讲明白协程调度的原理,看完面试直接怼懵面试官。

核心概念

GPM模型是Go调度的核心,三个字母分别代表:

  • G:Goroutine,也就是我们写的协程,每个G有自己的栈和上下文
  • P:Processor,处理器,管理G的队列,每个P绑定一个内核线程M
  • M:Machine,内核线程,真正执行G的代码的载体

调度流程

  1. 你用go func()创建一个G,它会被放到P的本地队列
  2. 如果本地队列满了,就会放到全局队列
  3. M绑定P,从P的本地队列取G执行,本地队列空了就去全局队列偷,再空了就去其他P的队列偷
  4. 每个G最多执行10ms,时间到了就会被换下,让其他G执行,不会被某个G占着CPU

为什么这么设计

高并发:几千个G同时跑都不是问题,比线程轻量太多,栈初始只有2KB ✅ 负载均衡:工作窃取算法保证每个P都有活干,不会出现忙的忙死闲的闲死 ✅ 低开销:G的切换只需要保存寄存器,不用切内核态,开销比线程小几个数量级

是不是很简单?下次面试再问Go调度,直接把这套说出来,offer直接到手!

后续我会出更多Go语言的底层原理和面试技巧,感兴趣的点个关注,面试不迷路~