首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

bthread源码剖析(二): 工作窃取与TaskGroup的run_main_task()

其中会涉及工作窃取(work stealing)。 sched_to():进行栈、寄存器等运行时上下文的切换,为接下来运行的任务恢复其上下文。 task_runner():执行任务。...现在我们的观察视角终于可以切入到“work stealing”了。 工作窃取(work stealing) 首先声明,work stealing不是协程的专利,更不是Go语言的专利。...work stealing是一种通用的实现负载均衡的算法。这里的负载均衡说的不是像Nginx那种对于外部网络请求做负载均衡,此处指的是每个CPU处理任务时,每个核的负载均衡。...不止协程,其实线程池也可以做work stealing。 20世纪90年代,MIT的Charles E. Leiserson 教授发起并指导了CILK项目。

73430

再见 Go 面试官:GMP 模型,为什么要有 P? | 极客时间

并且实现了 Work Stealing 算法来解决一些新产生的问题。 带来什么改变 加了 P 之后会带来什么改变呢?我们再更显式的讲一下。...每个 P 相对的平衡上,在 GMP 模型中也实现了 Work Stealing 算法,如果 P 的本地队列为空,则会从全局队列或其他 P 的本地队列中窃取可运行的 G 来运行,减少空转,提高了资源利用率...为什么要有 P 这时候可能会有人疑惑了,如果是想实现本地队列、Work Stealing 算法,那为什么不直接在 M 上加呢,M 也照样可以实现类似的功能。为什么又再加多一个 P 组件?...这显然是不合理的,因为本地队列的管理会变得复杂,且 Work Stealing 性能会大幅度下降。

45020

Go调度器系列(3)图解调度原理

work stealing,M如何去偷G。 为何需要自旋线程。 G进行系统调用,如何保证P的其他G'可以被执行,而不是饿死。 Go调度器的抢占。 12场景 提示:图在前,场景描述在后。 ?...全局队列已经没有g,那m就要执行work stealing:从其他有g的p哪里偷取一半g过来,放到自己的P本地队列。...图的上半部分是G的创建、负债均衡和work stealing,下半部分是M不停寻找和执行G的迭代过程。 如果你看这幅图还有些似懂非懂,建议赶紧开始看雨痕大神的Golang源码剖析,章节:并发调度。...宏观看调度器 参考资料 在学习调度器的时候,看了很多文章,这里列一些重要的: The Go scheduler: https://morsmachine.dk/go-scheduler Go's work-stealing...scheduler: https://rakyll.org/scheduler/,中文翻译版: https://lingchao.xin/post/gos-work-stealing-scheduler.html

75030
领券