假如 Go 能说话,听听 GMP 的心声
大綱
G 的心聲
M 的心聲
P 的心聲
操作系統(tǒng)內(nèi)核的心聲
Golang 的心聲
程序猿的心聲
奇伢的心聲
前情提要
最近發(fā)生了個(gè)大事件,Golang,G,M,P,程序猿,操作系統(tǒng)吵起來了,每個(gè)人都心有怨言,奇伢作為調(diào)解程序之友,對(duì)涉事的幾位當(dāng)事人做了一個(gè)簡(jiǎn)單的采訪。下面是這幾位當(dāng)事人的采訪記錄。
G 的心聲
大家好,我是 G,GMP 里的 G,我的英文名字叫 Goroutine。我心里一直有話要說,我感覺委屈。
這事得這么說起,首先我是 Golang 里的頭牌對(duì)吧,你看 Golang 的首字母和咱都是一樣的,Golang 也經(jīng)常拿我做宣傳亮點(diǎn)。程序跑的時(shí)候,幾乎只能看到我們 G 在 M 之間穿梭,我們其中反復(fù)橫跳。
程序猿所有的夢(mèng)想(代碼實(shí)現(xiàn))都是放在我的身上的,放在我的包袱里,封裝成我的樣子,然后運(yùn)到 M 上去處理,我?guī)土怂腥顺绦蛟硨?shí)現(xiàn)了他們的并發(fā)之夢(mèng),我本來應(yīng)該快樂。
1.13 之前,我是自由的,我想在 M 上待多久就待多久,早走晚走都可以,我以為這個(gè)是我的應(yīng)得的特權(quán)。
但自從 1.14 之后,一切都變了!!!我在 M 上稍微走的慢一點(diǎn),就喊打喊殺,把我丟出去,屁顛屁顛的伺候下一個(gè),不就是多占用一些 M 的時(shí)間嘛,有什么大不了的,咱還是不是主角嗎?搞得我現(xiàn)在好緊張,根本不敢放松,我覺得 M 針對(duì)我。再說了,慢也不是我的錯(cuò)呀,我包袱里裝的不都是那些程序猿的想法嘛,搞那些有的沒的的代碼。。。。
M 的心聲
大家好,我是 M,GMP 的 M,我英文名叫 Machine,平時(shí)大家看不到我(比如那些程序猿,他們眼里只有 G)。有些人覺得我很神秘,但其實(shí)我就是個(gè)普通的線程。我服務(wù)所有 G ,是真正的打工人,就我這樣的好人還要被人吐槽,太委屈了。我下面也要說點(diǎn)心里話,不針對(duì)任何人,特別是不針對(duì) G 和猿類。
咱是真正的勞動(dòng)人民,是真正吭呲吭呲干活的,所有的 G 都得依靠咱才能跑起來,不然 G 拿跟別人什么炫耀,我辛苦的處理 G 包袱里的東西,但是總有不地道的 G ,站著茅坑不拉屎,把 cpu 吃的飛起,咱也送不走這大爺。咱后面可是有成百上千的 G 后面排著隊(duì)呢,被催的要死,好像是我的錯(cuò)似的。
我一直是個(gè)好好先生,跟 G 好商好量的,G 走不走由他自己,但真有些不地道的 G,一占就是幾秒鐘(甚至不走),導(dǎo)致我很被動(dòng),于是我下定決心,這個(gè)權(quán)力得掌握在自己手里。1.14 之后,我強(qiáng)硬了,對(duì)那些在我地盤瘋狂吃 cpu,做無意義的事情的 G,20 毫秒到點(diǎn)之后,我必須把他趕走,伺候下一個(gè),咱是要對(duì)所有人公平。
P 的心聲
大家好,我是 P,GMP 的 P ,我的英文名叫做 Processor,英文名字看起來很高大上,但其實(shí)我并不是實(shí)際干活的。我就是個(gè)裝東西的簍子而已,你也可以叫我隊(duì)列,列表,都可以。我簍子里裝的是 G。雖然我簡(jiǎn)單,但是我驕傲。因?yàn)槲揖褪巧蟹綄殑?#xff0c;每個(gè)要上崗干活的 M 都要申請(qǐng)得到我(呵,男人),有 P 的 M 才是有身份的勞動(dòng)人民,才有資格處理 G ,其他的 M 都是黑工,將被剝奪服務(wù) G 的權(quán)利。
我一般有多少化身呢?看情況吧,不確定,一般咱就和機(jī)器的 CPU 核數(shù)一樣就行,當(dāng)然這個(gè)也可以改。
操作系統(tǒng)內(nèi)核的心聲
我沒啥要講的呀,我不知道?GMP 是啥東西,我不懂,這東西是他們用戶態(tài)鼓搗的東西,我就看到他們創(chuàng)建了幾個(gè)線程,還起了個(gè) Machine 的名字,每個(gè)線程 cpu 好像跑的還挺滿的,不知道在干啥,反正不關(guān)我的事。
Golang 的心聲
我是 Golang,大家也叫我 Go。我的父親是 Rob Pike(羅伯.派克),Ken Thompson(肯.湯普森)和Robert Griesemer(羅伯特.格利茨默),但我現(xiàn)在的爸爸是 Google 。
對(duì),一切都是我做的,我承認(rèn)。為了精致簡(jiǎn)化并發(fā)的使用姿勢(shì),我把協(xié)程天然集成在語言層面來實(shí)現(xiàn)。為了讓程序猿使用的更爽,我把內(nèi)存回收放到后臺(tái)打掃,這就是 runtime 的由來。
大家覺得我很激進(jìn),我承認(rèn)有賭的成分,但是有 Google 爸爸支持我,現(xiàn)在看來我覺得賭對(duì)了。
G 是我搞的,M 也是我搞的,P 也是我搞的,操作系統(tǒng)他不知情,他只是看到我在初始化的時(shí)候申請(qǐng)創(chuàng)建了幾個(gè)線程,我把這個(gè)線程包裝成了 M,我把用戶了代碼偽裝成了 G,放到 P 的簍子里,然后讓每個(gè) M 去處理,一切都很美好。
但其實(shí)我心里也委屈,我在不驚動(dòng)操作系統(tǒng)的基礎(chǔ)上,完成了完美的調(diào)度,讓并發(fā)的姿勢(shì)極致的簡(jiǎn)潔,讓 G 看起來都能并發(fā)執(zhí)行,就這樣還有人經(jīng)常怪我調(diào)度不給力,我能怎么辦?總有不地道的 G 占著 M,卡了 M 還怪我。我一看到 M 阻塞的多了,怕影響到 G 的服務(wù)質(zhì)量,趕緊創(chuàng)建新的 M ,結(jié)果操作系統(tǒng)又來怪我創(chuàng)建太多線程,我tm。
于是,我也變了,1.14 之后,我變的冷血無情,我只要看到 G 占著 M 時(shí)間超過一丟丟,我就忍不了,我就直接把 G 踢下去,讓 M 給別的 G 服務(wù)。
其實(shí)我還做了很多事情,為了讓那些懶惰的程序猿過上好日子,我連內(nèi)存回收都不讓他們自己做,手動(dòng)回收內(nèi)存很傷手的。結(jié)果又有猿類罵我清理內(nèi)存垃圾影響到他的正常工作了,其實(shí)我現(xiàn)在幾乎都沒有 stw 了,我。。。, 你回去寫你的 c 吧,多泄露泄露,多飛一些指針,多踩踩內(nèi)存,你就會(huì)想起我 Golang 好了。
程序猿的心聲
大家好,我是程序猿,我是所有語言的甲方。我對(duì) Go 這位同志也客觀的評(píng)價(jià)幾句:
Go 出生的時(shí)候我就關(guān)注他了,有背景,有噱頭,我對(duì)他的期待當(dāng)然很大。必須承認(rèn),Golang 并發(fā)姿勢(shì)確實(shí)簡(jiǎn)單,就 go 一下 函數(shù)( ) ?好像就并發(fā)運(yùn)行了,好神奇。
Go 它的成長(zhǎng)很快,剛出來的時(shí)候性能不忍看,運(yùn)行的時(shí)候卡個(gè)秒級(jí)也是常見,好在有個(gè)好爸爸,現(xiàn)在變了很多,但我總感覺就是還有成長(zhǎng)的空間,不能夸的太兇。
再說內(nèi)存,使用方便了,但是我總覺得垃圾回收好像會(huì)影響到我,具體原因我也說不出來,Golang 說他幾乎沒有 stw,反正我就怪他了。我覺得我是甲方天然的權(quán)力,吐槽是我的義務(wù),我躺好就行。
歡迎關(guān)注奇伢的公眾號(hào)和碼農(nóng)桃花源~
總結(jié)
以上是生活随笔為你收集整理的假如 Go 能说话,听听 GMP 的心声的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务容错、限流、资源隔离、熔断、监控…3
- 下一篇: 曹大带我学 Go(5)—— 哪里来的 g