GMP是Golang底层实现的一种调度协程的方案,目的是提高并发处理且降低切换成本。
G M P分别是底层实现中的三个数据结构。
g代表goroutine,指被调度的协程对象。
m代表线程,它是操作系统级别的线程,用来执行程序中的协程。
p代表processer,是CPU的抽象。
默认情况下,go程序会为每个CPU创建一个P(通过GOMAXPROCS调整),并在程序启动时创建多个M,M的数量往往略大于P的数量。
M被调度到P上执行G。G被维护在两个列表中,一个是全局队列,一个是P的本地队列。
整个调度过程 Golang提供了runtime包用来实现对协程管理的跟踪和查看。
g创建
g创建时,首先看能否放置在m本地的队列中,如果发现已经到达了256个,则会放置到全局队列中,此时会将本地中一半的g放置到全局队列。
g调度
调度器在调度g时,先从local 队列中查找,然后再去全局队列中找。有时候会从系统调用或者网络轮询中调度。
G0 是M的第一个routine,负责系统调用和网络轮询。