关于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