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

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

G 的心声

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

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

97d380486da2366cebfff016242ac95a.gif

程序猿所有的梦想(代码实现)都是放在我的身上的,放在我的包袱里,封装成我的样子,然后运到 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 毫秒到点之后,我必须把他赶走,伺候下一个,咱是要对所有人公平。

41eb03c11aae1f9124b8117df36b9236.png

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 。

1eca01224ea7d1e213a6a94bd87b7d87.png

对,一切都是我做的,我承认。为了精致简化并发的使用姿势,我把协程天然集成在语言层面来实现。为了让程序猿使用的更爽,我把内存回收放到后台打扫,这就是 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 一下 函数( ) 好像就并发运行了,好神奇。

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

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

奇伢的心声

以上就是奇伢采访 GMP 的记录,他们各说各有理,我们且当个看官。

其实奇伢也有些委屈,陆续有些读者朋友提了一些疑问,借此文章宝地,说两句心里话哈:

问题一:奇伢你最近转载有点多呀?

确实,最近有些转载。奇伢除了自己定期会分享有思考的原创文章,也会定期的分享一些优质的朋友的文章。分享的原因有两个:

  1. 不同的圈子相互交流,可以传播更多的知识,让读者朋友有机会了解更多的优质文章;
  2. 想同类别的号主的优质互转,可以促进圈子的融合,才能有更多的传播;

上面是官方的术语,读者可能听不大懂哈。那奇伢说句掏心窝子的大白话:转载、互推只为了活下去而已

首先,优质原创干货的内容一定必须的。但仅仅如此远远不够,这几乎不能主动的引起别人的关注,公众号的圈子是一个私域的流量圈子。当只有 10 个人关注你的时候,你如果不主动做任何传播,你就算写出个 10 万字的超级干货,也还是只有这 10 个人知道你而已。

笔者曾经花了两周的时间精心输出的干货文章,从构思,画图,Linux 内核代码阅读,测试代码编写和验证,极其耗费精力。但就算是这样一篇文章,如果不算别人的转载,主动引发别人的新关注也只有个位数。

在此非常非常感谢那些愿意主动分享奇伢文章的读者朋友,真的,没有你们的分享和【在看】,那就真的一个新关注都不会有。

有时候,奇伢确实有点委屈,发一些高质量文章的时候效果并不好,读者朋友大都看完滑走,转载的时候会吐槽,随手取关。。。

一切为了活着。

问题二:公众号分享的领域和节奏?

我的公众号会持续分享以云存储领域为核心的文章。从 Linux 基础,c/c++ 或 Go 语言的基础知识,网络基础知识,分布式架构方面的知识,还有 Linux 工具原理都会有分享,一周一篇原创。

编程语言 + 编程内功 => 应用领域

问题三:谈谈公众号以后的想法

本质工作确实挺忙的,这个是绝对的优先级。所以,基本上只有周末抽时间总结梳理一些思考文章,但无论多忙,奇伢给自己定制的目标是一周至少一篇原创的分享。

奇伢自己也在持续学习,会把自己学习到的优质文章,优质的号主分享给大家。这些发布的文章,一定是奇伢认为有学习收获的文章。本公众号有自己的底线,绝对不会抄袭的行为,也绝对不会贩卖焦虑,只想做一个实打实的,有思考,有温度的公众号。

问题四:对这些读者朋友的建议、夸赞、吐槽,怎么看?

首先,我非常感谢那些和我互动的读者,这是真心话,无论是夸我还是吐槽我,我都觉得他们是喜欢我的文章才来留言的,只有是在乎才会和我互动,在此非常感谢。也希望能得你们持续的支持和关注。

问题五:奇伢近期的规划?

最近在梳理一个硬核分享,关于 Linux 文件系统的,希望通过这个系列分享,让所有人都对文件系统有绝对深刻的理解。敬请期待。


坚持思考,方向比努力更重要。关注公众号:奇伢云存储,获取更多干货。 关注我公众号, 获取更多干货