Go的GMP模型
2023年12月7日
一、进程、线程、协程
- 进程:内存和资源调度的最小单位。 可包含多个线程。
- 线程:CPU调度的最小单位。 CPU在多个线程之间来回切换,有成本。
- 协程:非系统层面的,Golang的用户态线程,与线程对应关系 M:N。
二、GMP模型
- G: goroutine,存有上下文等信息。独立的栈,初始大小2KB。
- P: processor,逻辑处理器,调度器。维护一个本地G队列,含有内存分配信息。数量由
GOMAXPROCS
决定,默认为CPU核心数。(老版本没有P,G在全局队列有锁竞争,增加P可以降低M对G的复杂性。) - M: mochine,虚拟内核线程,绑定P后真正执行计算的资源。 一个M对应一个线程。
三、GMP流程
G创建后绑定在某个P的本地队列中(本地队列满了放入全局队列),P绑定到M上依次执行G。
四、GMP其他机制
- 抢占:一个G最多占用时间片10ms,防止其他G被饿死
- 偷取:当一个P中所有G执行完后,会从别的P中拿一半的G放入自己队列。都没有从全局队列拿(需要加锁,效率低)
- 线程复用:当前M0阻塞,将P转移给空闲的M1,自己关注当前G。