返回信息流文一:这个线程上的其他goroutine就会迁移到其他线程,这样能继续运行
文二:runtime 调度器会做goroutine的上下文切换(听上去还是在原来的线程中)
那么是重开一个线程,杀死原来线程,还是在原来的线程中做context切换
这是一条镜像帖。来源:北邮人论坛 / golang / #741同步于 2016/12/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖
一个线程情况下,goroutine阻塞时,任务是如何切换的
henceman
2016/12/23镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
golang并发模型中3个概念:P,M,G。 P指的是processor,个数为GOMAXPROCS的值;M是指系统线程;G是goroutine。
每一个M需要绑定到一个P之后,才能运行G。也就是说这三个角色绑在一块的时间是用户程序运行的时间,其他时间是runtime执行调度的时间。
由于P的数量是固定不变的,每一个P维护一个G的队列。除此之外,还有一个全局G队列。然后每一个P只有在绑定一个M的时候才能消费G队列。
假设我们只有一个P,且绑定了M0,正常消费G队列的时候如果一个goroutine时间比较长,会切换到下一个,这个应该就是lz说的文二。至于怎么判断时间长短和怎么切换。请google sysmon。
刚才说的正常消费G队列,是指没有遇到阻塞syscall的情况。那如果遇到了,这个M0-G对,会让出P,同时创建一个新的M1, 这样P-M1接管这个G队列。这个应该就是lz说的文一吧。
多谢指点,我也是看到goroutine 是协作式的调度而困惑,在无阻塞的情况下不会被其他抢占,但是会被sysmon 标记哈,我看到当被标记的goroutine调用非内联函数时会让出P,这里调用非内联函数有什么玄机?或者就是一种实现方式,也可以有其他的方式
【 在 inaadversity 的大作中提到: 】
: golang并发模型中3个概念:P,M,G。 P指的是processor,个数为GOMAXPROCS的值;M是指系统线程;G是goroutine。
: 每一个M需要绑定到一个P之后,才能运行G。也就是
: .........
发自「贵邮」
一种检查标记的实现方式吧,非内联函数调用涉及创建新的栈帧,我个人猜测这时候会检查那个标志位。因为标记也是记录在goroutine的栈上的。具体实现只能去分析源码了吧。