GoLang之GMP常见问题总结

本文深入探讨了Go语言中的GMP模型,当G(goroutine)阻塞时,M(machine)和P(processor)如何响应。在系统调用或用户态阻塞情况下,G会挂起,M可能寻找新的P或进入休眠。工作窃取策略确保任务分配的均衡。同时,介绍了Go协程调度的时间片和切换机制。
摘要由CSDN通过智能技术生成

GoLang之GMP常见问题总结

1.gmp当一个g堵塞时,g、m、p会发生什么?

M 会阻塞,如果当前有 G 在执行,调度器会触发hand off机制,会将 MP 进行分离,如果有空闲的M就用或者是从线程池中取,如果都没有就创建一个新的M 来服务于这个 P,当M进行系统调用结束的时候,这个G会尝试获取一个空闲的 P 执行,并放入到这个 P 的本地队列。如果获取不到 P,那么这个线程 M 变成休眠状态, 加入到空闲线程中,然后这个 G 会被放入全局队列中。

总结:
即 M阻塞,MP会进行分离,寻找空闲的M;
系统调用结束后:G寻找空闲的P执行,加入P本地队列,如果获取不到,M休眠,G加入全局队列

造成阻塞还有一种情况:用户态阻塞(只是阻塞G)例如网络IO、阻塞式channel、sleep等场景(简单来说就是CPU这时候对于这个协程没有事情要做),对于这类阻塞会将G暂时挂起到某一临时等待队列中,待阻塞结束后重新寻找P放入。

2.Go协程阻塞太长时间会发生什么?

协程的切换时间片是10ms,也就是说 goroutine 最多执行10ms就会被 M 切换到下一个 G。这个过程,又被称为 中断,挂起;

3.Go协程阻塞太长时间会发生什么?

假设M的任务队列里有G1、G2,G1遇到异步系统调用时,M会先执行G2,G1异步返回时,插入回M的任务队列尾部。

4.Go协程遇到同步系统调用是怎么做的?

假设M的任务队列里有G1、G2,G1遇到同步系统调用时,G1会被调度到另外一个完全空闲的M上执行(如果不存在,则先创建一个新的M),G1同步返回时,插入回M的任务队列尾部。

5.工作窃取

当一个M的任务队列空闲时,可以从其他M或全局任务队列窃取任务。窃取优先级是:
1.其他M
2.全局

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoGo在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值