关于M和P的数量的问题答疑昨天群里陷入了讨论,我看了一下代码把调用关系列在了这个文档里
设计考量
代码分析
/usr/local/go/src/runtime/proc.go
schedinit()-->
sched.maxmcount = 10000 // m count limit is 10000 by default
procs = atoi32(gogetenv("GOMAXPROCS"))
procresize(procs)-->
nallp := make([]*p, nprocs) // P count is read from environment variable GOMAXPROCS
pp.init(i)
p.m.set(mget()) // mget to associate p with idle m
schedule()-->
wakep()-->
startm()-->
nmp := mget()
if nmp == nil {
newm(fn, _p_, id)-->
mp := new(m)
mp.g0 = malg(8192 * sys.StackGuardMultiplier) // g0 is the maintainer for the m, like create other G
}
nmp.nextp.set(_p_)
notewakeup(&nmp.park)-->
semawakeup((*m)(unsafe.Pointer(v)))
pthread_cond_signal(&mp.cond) // wake up the kernel thread