关于可以被接管的阻塞goroutine问题

关于可以被接管的阻塞goroutine问题

问题描述:

可以被runtime接管的阻塞goroutine,放在等待结构体的时候,这个goroutines是在local queue上么。当阻塞恢复时,这个goroutine是优先进行调度还是按照正常顺序进行调度?


请老师解答。


正在回答

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

2回答

放在等待结构体的时候,不在 run queue,可以从字面上理解一下 run queue 的含义,run = 可执行


阻塞恢复的时候,要进 run queue,(这里说的是可以接管的那些阻塞,syscall 的有另一套流程),一般情况下是高优先级调度(可以看看 runtime.ready 这个函数,next 参数= true 就是高优先级)。



  • next {
    retryNext:
       oldnext := _p_.runnext
       !_p_.runnext.(oldnext(.(gp))) {
          retryNext
       }
       oldnext == {
          }
       gp = oldnext.()
    }

    这个高优先级,就是有限使用runnext指针(把老g的踢到队列里)


    ​看到除了gcsweep,其他的ready调度都是next都是true

    2021-05-16 01:33:57
  • 是的

    字数补丁

    2021-05-16 13:50:00
  • 为什么我搜索的时候发现只有在mgcXXXX.go里面调用ready函数的时候next为false,gcsweep里面是为true的。然后globrunqget以及goyield_m里面是为false的。

    2021-06-10 22:33:09
Xargin 2021-05-16 00:00:34

阻塞的时候不在 run queue 队列里(这里可以理解一下 run queue 的 run 的意思,在 run queue 里的 g 应该都是 runnable 状态,这节课没有讲 goroutine 的状态切换,因为内容太多了(我们在最后会补


而是在专门的等待结构里,对应的就是 PPT 图里的 channel 对应的 sendq、recvq

锁的 treap 里的节点的链表,等等

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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