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

来源:1-4 Go 程序是怎么跑起来的

大哈迪

2021-05-15 23:27:22

问题描述:

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


请老师解答。


写回答

2回答

Xargin

2021-05-16

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


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


3
han_beta
回复
hrook_StudyMachine
hp>为什么我搜索的时候发现只有在mgcXXXX.go里面调用ready函数的时候next为false,gcsweep里面是为true的。然后globrunqget以及goyield_m里面是为false的。

h021-06-10
共3条回复

Xargin

2021-05-16

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


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

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

1

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程