Go语言的[GPM模型]

Go语言的[GPM模型]_第1张图片

在go中,线程是运行Groutine的实体,调度器的功能是把可以运行的Groutine分配到工作线程上

GPM模型

Go语言的[GPM模型]_第2张图片

M与P的数量没有绝对的数量关系,当一个M阻塞时,P就会创建一个或者切换到另一个M,所以即使设置了runtime.GOMAXPROCS(1)
也可能创建多个M出来;
当M发现给自己输送G协程的那个P队列为空时会主动从其他P队列"偷",这个过程的发起端是协程调度器,

当M阻塞时,P调度器会将令阻塞的M释放绑定的P,而后把这个P交给其他M区执行;

GPM模型为了更大程度地利用M和P的性能,不会让一个P永远被一个阻塞的G1耽误之后的工作

Go语言的[GPM模型]_第3张图片

Go中,一个协程最多占用cpu10ms,这样是为了防止其他协程无cpu可用

协程的调度流程

Go语言的[GPM模型]_第4张图片

你可能感兴趣的:(#,高并发,golang,开发语言,后端)