首先先介绍下os线程和cpu线程,这个有人知道吗?cpu线程就是我们常说的四核八线程的线程个数,而os线程指的是系统进程调度线程。可以有很多个。

golang中gmp的m指的os中的线程。

golang中的GOMAXPROCS设置的最大线程指的是同一时刻可以执行的最大线程个数,但是并不包含系统调用阻塞的线程。

GMP调度过程中,P的个数一般是cpu的核数,M会略大于P的个数。

如果g中发生系统调度,就会造成线程阻塞,如果有太多的g发生系统调度,会造成os产生更多的m,过多的m会造成操作系统切换线程消耗更多的资源。同时在G系统调度结束后,m会放到空闲缓存队列,并不会销毁,这就造成了m会很多。