社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
在Go中,线程是运行goroutine
的实体,调度器的功能是把可运行的goroutine
分配到工作线程上。
Global Queue
):存放等待运行的G。GOMAXPROCS
(可配置)个。M
运行G
,G执行之后,M会从P获取下一个G,不断重复下去。Goroutine
调度器和OS
调度器是通过M
结合起来的,每个M
都代表了1
个内核线程,OS调度器负责把内核线程分配到CPU
的核上执行。1、P的数量
由启动时环境变量$GOMAXPROCS
或者是由runtime
的方法GOMAXPROCS()
决定。这意味着在程序执行的任意时刻都只有$GOMAXPROCS
个goroutine
在同时运行。
2、M的数量
go语言本身的限制:go程序启动时,会设置M
的最大数量,默认10000
.但是内核很难支持这么多的线程数,所以这个限制可以忽略。runtime/debug
中的SetMaxThreads
函数,设置M的最大数量
一个M
阻塞了,会创建新的M。
M与P的数量没有绝对关系,一个M
阻塞,P
就会去创建或者切换另一个M
,所以,即使P的默认数量是1
,也有可能会创建很多个M
出来。
3、P和M何时会被创建
P
何时创建:在确定了P的最大数量n
后,运行时系统会根据这个数量创建n
个P
。M
何时创建:没有足够的M来关联P
并运行其中的可运行的G
。比如所有的M此时都阻塞住了,而P中还有很多就绪任务,就会去寻找空闲的M,而没有空闲的,就会去创建新的M。如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!