M的创建和P的分配疑问

M的创建和P的分配疑问

GPM是怎样一个策略创建的M?runtime打包的计算任务(go func)是怎样的策略绑定给哪个P

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
Xargin 2021-05-16 15:27:04

M 创建其实就是几个原则:

  1. 创建了多少个 P,那就至少需要多少个 M

  2. 如果 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

  • 创建出来的 g 和当前创建这个 g 的那个 g 在同一个线程上 

    这里我有个疑问,就是在main函数里面go func创建的g是不是都在main goroutine绑定线程所在的P的runq。假如我的应用都是在main函数创建的goroutine,是不是都在同一个runq了,然后其它m绑定的p没有可执行的g,再去main goroutin对应的runq去stealing。不知道我的理解对不对。

    2021-05-17 18:54:07
  • 创建出来的 g 和当前创建这个 g 的那个 g 在同一个线程上 ————》 那么在main函数调用的后续函数中,如果创建go func,那么都会绑定到main goroutine绑定线程所在的P的runq。

    那么剩余的其他 p 不是在空闲了吗? 

    2021-05-19 20:18:50
  • Xargin #3

    创建出来的 g 和当前创建这个 g 的那个 g 在同一个线程上 

    这里我有个疑问,就是在main函数里面go func创建的g是不是都在main goroutine绑定线程所在的P的runq。假如我的应用都是在main函数创建的goroutine,是不是都在同一个runq了,然后其它m绑定的p没有可执行的g,再去main goroutin对应的runq去stealing。不知道我的理解对不对。


    是的,main goroutine 创建出来的一开始和 main goroutine 肯定在同一个线程,都在一个 runq 里


    其它 m 没可执行的 g 会偷走


    你理解的没问题~


    慕课这种问题后面的连环问好像没法看到通知,好尴尬

    2021-05-20 16:14:46
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师