🚀 3分钟搞懂Go语言协程调度,面试再也不怕被问了!
Go语言的协程(Goroutine)是它最大的特色,也是面试必问的考点,今天用最通俗的话给你讲明白协程调度的原理,看完面试直接怼懵面试官。
核心概念
GPM模型是Go调度的核心,三个字母分别代表:
- G:Goroutine,也就是我们写的协程,每个G有自己的栈和上下文
- P:Processor,处理器,管理G的队列,每个P绑定一个内核线程M
- M:Machine,内核线程,真正执行G的代码的载体
调度流程
- 你用
go func()创建一个G,它会被放到P的本地队列 - 如果本地队列满了,就会放到全局队列
- M绑定P,从P的本地队列取G执行,本地队列空了就去全局队列偷,再空了就去其他P的队列偷
- 每个G最多执行10ms,时间到了就会被换下,让其他G执行,不会被某个G占着CPU
为什么这么设计
✅ 高并发:几千个G同时跑都不是问题,比线程轻量太多,栈初始只有2KB ✅ 负载均衡:工作窃取算法保证每个P都有活干,不会出现忙的忙死闲的闲死 ✅ 低开销:G的切换只需要保存寄存器,不用切内核态,开销比线程小几个数量级
是不是很简单?下次面试再问Go调度,直接把这套说出来,offer直接到手!
后续我会出更多Go语言的底层原理和面试技巧,感兴趣的点个关注,面试不迷路~