假如 Go 能说话,听听 GMP 的心声

Posted qcrao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了假如 Go 能说话,听听 GMP 的心声相关的知识,希望对你有一定的参考价值。

大纲

  • G 的心声

  • M 的心声

  • P 的心声

  • 操作系统内核的心声

  • Golang 的心声

  • 程序猿的心声

  • 奇伢的心声

前情提要

最近发生了个大事件,Golang,G,M,P,程序猿,操作系统吵起来了,每个人都心有怨言,奇伢作为调解程序之友,对涉事的几位当事人做了一个简单的采访。下面是这几位当事人的采访记录。

G 的心声

大家好,我是 G,GMP 里的 G,我的英文名字叫 Goroutine。我心里一直有话要说,我感觉委屈。

这事得这么说起,首先我是 Golang 里的头牌对吧,你看 Golang 的首字母和咱都是一样的,Golang 也经常拿我做宣传亮点。程序跑的时候,几乎只能看到我们 G 在 M 之间穿梭,我们其中反复横跳。

程序猿所有的梦想(代码实现)都是放在我的身上的,放在我的包袱里,封装成我的样子,然后运到 M 上去处理,我帮了所有人程序猿实现了他们的并发之梦,我本来应该快乐。

1.13 之前,我是自由的,我想在 M 上待多久就待多久,早走晚走都可以,我以为这个是我的应得的特权。

但自从 1.14 之后,一切都变了!!!我在 M 上稍微走的慢一点,就喊打喊杀,把我丢出去,屁颠屁颠的伺候下一个,不就是多占用一些 M 的时间嘛,有什么大不了的,咱还是不是主角吗?搞得我现在好紧张,根本不敢放松,我觉得 M 针对我。再说了,慢也不是我的错呀,我包袱里装的不都是那些程序猿的想法嘛,搞那些有的没的的代码。。。。

M 的心声

大家好,我是 M,GMP 的 M,我英文名叫 Machine,平时大家看不到我(比如那些程序猿,他们眼里只有 G)。有些人觉得我很神秘,但其实我就是个普通的线程。我服务所有 G ,是真正的打工人,就我这样的好人还要被人吐槽,太委屈了。我下面也要说点心里话,不针对任何人,特别是不针对 G 和猿类。

咱是真正的劳动人民,是真正吭呲吭呲干活的,所有的 G 都得依靠咱才能跑起来,不然 G 拿跟别人什么炫耀,我辛苦的处理 G 包袱里的东西,但是总有不地道的 G ,站着茅坑不拉屎,把 cpu 吃的飞起,咱也送不走这大爷。咱后面可是有成百上千的 G 后面排着队呢,被催的要死,好像是我的错似的。

我一直是个好好先生,跟 G 好商好量的,G 走不走由他自己,但真有些不地道的 G,一占就是几秒钟(甚至不走),导致我很被动,于是我下定决心,这个权力得掌握在自己手里。1.14 之后,我强硬了,对那些在我地盘疯狂吃 cpu,做无意义的事情的 G,20 毫秒到点之后,我必须把他赶走,伺候下一个,咱是要对所有人公平

P 的心声

大家好,我是 P,GMP 的 P ,我的英文名叫做 Processor,英文名字看起来很高大上,但其实我并不是实际干活的。我就是个装东西的篓子而已,你也可以叫我队列,列表,都可以。我篓子里装的是 G。虽然我简单,但是我骄傲。因为我就是尚方宝剑,每个要上岗干活的 M 都要申请得到我(呵,男人),有 P 的 M 才是有身份的劳动人民,才有资格处理 G ,其他的 M 都是黑工,将被剥夺服务 G 的权利。

我一般有多少化身呢?看情况吧,不确定,一般咱就和机器的 CPU 核数一样就行,当然这个也可以改。

操作系统内核的心声

我没啥要讲的呀,我不知道 GMP 是啥东西,我不懂,这东西是他们用户态鼓捣的东西,我就看到他们创建了几个线程,还起了个 Machine 的名字,每个线程 cpu 好像跑的还挺满的,不知道在干啥,反正不关我的事。

Golang 的心声

我是 Golang,大家也叫我 Go。我的父亲是 Rob Pike(罗伯.派克),Ken Thompson(肯.汤普森)和Robert Griesemer(罗伯特.格利茨默),但我现在的爸爸是 Google

对,一切都是我做的,我承认。为了精致简化并发的使用姿势,我把协程天然集成在语言层面来实现。为了让程序猿使用的更爽,我把内存回收放到后台打扫,这就是 runtime 的由来。

大家觉得我很激进,我承认有赌的成分,但是有 Google 爸爸支持我,现在看来我觉得赌对了。

G 是我搞的,M 也是我搞的,P 也是我搞的,操作系统他不知情,他只是看到我在初始化的时候申请创建了几个线程,我把这个线程包装成了 M,我把用户了代码伪装成了 G,放到 P 的篓子里,然后让每个 M 去处理,一切都很美好。

但其实我心里也委屈,我在不惊动操作系统的基础上,完成了完美的调度,让并发的姿势极致的简洁,让 G 看起来都能并发执行,就这样还有人经常怪我调度不给力,我能怎么办?总有不地道的 G 占着 M,卡了 M 还怪我。我一看到 M 阻塞的多了,怕影响到 G 的服务质量,赶紧创建新的 M ,结果操作系统又来怪我创建太多线程,我tm。

于是,我也变了,1.14 之后,我变的冷血无情,我只要看到 G 占着 M 时间超过一丢丢,我就忍不了,我就直接把 G 踢下去,让 M 给别的 G 服务。

其实我还做了很多事情,为了让那些懒惰的程序猿过上好日子,我连内存回收都不让他们自己做,手动回收内存很伤手的。结果又有猿类骂我清理内存垃圾影响到他的正常工作了,其实我现在几乎都没有 stw 了,我。。。, 你回去写你的 c 吧,多泄露泄露,多飞一些指针,多踩踩内存,你就会想起我 Golang 好了。

程序猿的心声

大家好,我是程序猿,我是所有语言的甲方。我对 Go 这位同志也客观的评价几句:

Go 出生的时候我就关注他了,有背景,有噱头,我对他的期待当然很大。必须承认,Golang 并发姿势确实简单,就 go 一下 函数( )  好像就并发运行了,好神奇。

Go 它的成长很快,刚出来的时候性能不忍看,运行的时候卡个秒级也是常见,好在有个好爸爸,现在变了很多,但我总感觉就是还有成长的空间,不能夸的太凶。

再说内存,使用方便了,但是我总觉得垃圾回收好像会影响到我,具体原因我也说不出来,Golang 说他几乎没有 stw,反正我就怪他了。我觉得我是甲方天然的权力,吐槽是我的义务,我躺好就行。


欢迎关注奇伢的公众号和码农桃花源~

以上是关于假如 Go 能说话,听听 GMP 的心声的主要内容,如果未能解决你的问题,请参考以下文章

Go底层原理:一起来唠唠GMP调度

通俗易懂的Go协程的引入及GMP模型简介

通俗易懂的Go协程的引入及GMP模型简介

GO高阶: 调度器 GMP 原理与调度全分析

【golang详解】go语言GMP(GPM)原理和调度

GO GMP协程调度实现原理 5w字长文史上最全