M的创建和P的分配疑问
GPM是怎样一个策略创建的M?runtime打包的计算任务(go func)是怎样的策略绑定给哪个P
144
收起
正在回答 回答被采纳积分+1
1回答
Xargin
2021-05-16 15:27:04
M 创建其实就是几个原则:
创建了多少个 P,那就至少需要多少个 M
如果 M 被 syscall/cgo 这类必须独占线程的操作阻塞住了,要保证 CPU 所有核心仍然能够得到充分利用,就需要创建更多的 M(这里说的是没有空闲 M 的时候),这时候 sysmon 剥离掉那些阻塞住的 M 的 P 以后,P > 正在执行调度循环的 M,那就需要把 M 补齐
创建 M 的函数是 runtime.startm,有兴趣你可以跟一下这个函数在哪里被调用
go func 是个语法糖,本质上就是调用了 runtime.newproc,创建出来的 g 和当前创建这个 g 的那个 g 在同一个线程上,也就对应的是这个线程绑定的那个 P,进的队列也是优先进这个 P 的 runnext 和 local queue
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星