Below you will find pages that utilize the taxonomy term “Gpm”
January 21, 2021
golang中G、P、M 和 sched 三者的数据结构
"\u003cp\u003eG、P、M 三者是golang实现高并发能的最为重要的概念,\u003ccode\u003eruntime\u003c/code\u003e 通过 \u003ccode\u003e调度器\u003c/code\u003e 来实现三者的相互调度执行,通过 \u003ccode\u003ep\u003c/code\u003e 将用户态的 \u003ccode\u003eg\u003c/code\u003e 与内核态资源 \u003ccode\u003em\u003c/code\u003e 的动态绑定来执行,以减少以前通过频繁创建内核态线程而产生的一系列的性能问题,充分发挥服务器最大有限资源。\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/01/7c68d000148bf601267b43631c795bfd.png\" alt=\"\"\u003eGPM 协作\u003c/p\u003e\n\u003cp\u003e调度器的工作是将一个 G(需要执行的代码)、一个 M(代码执行的地方)和一个 P(代码执行所需要的权限和资源)结合起来。\u003c/p\u003e\n\u003cp\u003e所有的 g、m 和 p 对象都是分配在\u003ccode\u003e堆\u003c/code\u003e上且永不释放的,所以它们的内存使用是很稳定的。得益于此,runtime 可以在调度器实现中避免写屏障。当一个G执行完成后,可以放入pool中被再次使用,避免重复申请资源。\u003c/p\u003e\n\u003cp\u003e本节主要通过阅读runtime源码来认识这三个组件到底长的是什么样子,以此加深对 GPM 的理解。go version go1.15.6\u003c/p\u003e\n\u003cp\u003e理解下文前建议先阅读一下 \u003ccode\u003esrc/runtime/HACKING.md\u003c/code\u003e 文件,中文可阅读 \u003ca href=\"https://www.purewhite.io/2019/11/28/runtime-hacking-translate/\"\u003e这里\u003c/a\u003e,这个文件内容是面向开发者理解\u003ccode\u003eruntime\u003c/code\u003e的很值得看一看。\u003c/p\u003e\n\u003cp\u003e本文若没有指定源码文件路径,则默认为 \u003ccode\u003esrc/runtime/runtime2.go\u003c/code\u003e。\u003c/p\u003e\n\u003ch1 id=\"g\"\u003eG\u003c/h1\u003e\n\u003cp\u003eG …\u003c/p\u003e"