在go中,线程是运行Groutine的实体,调度器的功能是把可以运行的Groutine分配到工作线程上
GPM模型
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中,一个协程最多占用cpu10ms,这样是为了防止其他协程无cpu可用