总览图

名词解释
- G: 表示goroutine,存储了goroutine的执行stack信息、goroutine状态以及goroutine的任务函数等;另外G对象是可以重用的。
- P: 表示逻辑processor,P的数量决定了系统内最大可并行的G的数量(前提:系统的物理cpu核数>=P的数量);P的最大作用还是其拥有的各种G对象队列、链表、一些cache和状态。
- M: M代表着真正的执行计算资源。在绑定有效的p后,进入schedule循环;而schedule循环的机制大致是从各种队列、p的本地队列中获取G,切换到G的执行栈上并执行G的函数,调用goexit做清理工作并回到m,如此反复。M并不保留G状态,这是G可以跨M调度的基础。
三者关系:
P是一个“逻辑Proccessor”,每个G要想真正运行起来,首先需要被分配一个P(进入到P的local runq中,这里暂忽略global runq那个环节)。对于G来说,P就是运行它的“CPU”,可以说:G的眼里只有P。但从Go scheduler视角来看,真正的“CPU”是M,只有将P和M绑定才能让P的runq中G得以真实运行起来。这样的P与M的关系,就好比Linux操作系统调度层面用户线程(user thread)与核心线程(kernel thread)的对应关系那样(N x M)。
参考文章
Golang并发编程——Goroutine底层实现详解_VampireWeekend的博客-优快云博客_goroutine底层实现
本文详细介绍了Golang并发编程中的关键概念:Goroutine、P和M。Goroutine代表轻量级线程,P作为逻辑处理器管理G的执行,而M则代表实际的计算资源。G需要与P绑定并通过M来执行。P与M之间的关系类似于Linux中的用户线程与核心线程。理解这三者的交互对于优化Golang并发性能至关重要。
2403

被折叠的 条评论
为什么被折叠?



