讲一讲go协程的GMP理论

0
小熊
小熊
管理员提问于1年前

首先协程和线程是多对多的关系,一般是多对一,只要不涉及多线程就不涉及抢占和线程上下文切换

讲一讲go协程的GMP理论

G指goroutine M thread(machine)、P(Processor处理器)

* 在 Go 中,线程是运行 goroutine 的实体,调度器的功能是把可运行的 goroutine 分配到工作线程上。
* 全局队列(Global Queue):存放等待运行的 G。
* P 的本地队列:同全局队列类似,存放的也是等待运行的 G,存的数量有限,不超过 256 个。新建 G’时,G’优先加入到 P 的本地队列,如果队列满了,则会把本地队列中一半的 G 移动到全局队列。
* P 列表:所有的 P 都在程序启动时创建,并保存在数组中,最多有 GOMAXPROCS(可配置) 个。
* M:线程想运行任务就得获取 P,从 P 的本地队列获取 G,P 队列为空时,M 也会尝试从全局队列拿一批 G 放到 P 的本地队列,或从其他 P 的本地队列偷一半放到自己 P 的本地队列。M 运行 G,G 执行之后,M 会从 P 获取下一个 G,不断重复下去。

一句话:协程创建先放入P的队列,放满了把一半放G的全局队列,M顺序取P来运行,如果M没有取到(P为空)移动全局队列到P中,或者去其他P上取,所以M有调度的作用

引用:Golang 调度器 GMP 原理与调度全分析

延展阅读见 goroutine是并行还是并发?

小熊
小熊
管理员
评论于1年前

延展阅读见 goroutine是并行还是并发?