假如 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 的心声的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务容错、限流、资源隔离、熔断、监控…3
- 下一篇: 曹大带我学 Go(5)—— 哪里来的 g