Go GMP

一文徹底弄懂go中的調(diào)度GMP
先說躬厌,協(xié)程的本質(zhì)是用戶態(tài)的線程铛碑,用戶對其有控制權限狠裹,內(nèi)存占用少,切換代價低亚茬。

再來解釋一下MPG是什么意思酪耳。

M代表內(nèi)核線程,所有的G都要放在M上才能運行刹缝。

P代表控制器,調(diào)度G到M上颈将,其維護了一個隊列梢夯,存儲了所有需要它來調(diào)度的G。

G代表一個go routine單元晴圾。

補充幾點常見的調(diào)度策略:

1颂砸,如果某個M陷入阻塞呢?
當一個OS線程M由于io操作而陷入阻塞,假設此時G0正跑在了M上人乓,那么M上綁定的P就會帶著余下的所有G去尋找新的M勤篮。當M恢復過來時,一般情況下色罚,會從別的M上拿過來一個P碰缔,并把原先跑在其上的G0放到P的隊列中,從而運行G0戳护。如果金抡,沒有拿到可用的P的話,就把G0放入到全局global runqueue隊列中腌且,使G0等待被調(diào)度梗肝,然后M進入線程緩存。所有的P也會周期性的檢查global runqueue并運行其中的goroutine铺董,否則global runqueue上的goroutine永遠無法執(zhí)行巫击。

2,如果有的M較忙精续,有的M較閑呢喘鸟?
此時P所分配的任務G很快就執(zhí)行完了(分配不均),這就導致了這個處理器P很忙驻右,但是其他的P還有任務什黑。此時,P首先會去global runqueue取G堪夭。但是愕把,如果global runqueue沒有任務G了,那么P不得不從其他的P里拿一些G來執(zhí)行森爽。一般來說恨豁,如果P從其他的P那里要拿任務的話,一般就拿run queue的一半爬迟,這就確保了每個OS線程都能充分的使用橘蜜。

3,如果一個G運行時間過長付呕,導致隊列中后續(xù)G都無法運行呢计福?
啟動的時候,會專門創(chuàng)建一個線程sysmon徽职,用來監(jiān)控和管理象颖,在內(nèi)部是一個循環(huán)。首先姆钉,記錄所有P的G任務計數(shù)schedtick说订,schedtick會在每執(zhí)行一個G任務后遞增抄瓦。如果檢查到 schedtick一直沒有遞增,說明這個P一直在執(zhí)行同一個G任務陶冷,如果超過一定的時間(10ms)钙姊,就在這個G任務的棧信息里面加一個標記。然后這個G任務在執(zhí)行的時候埂伦,如果遇到非內(nèi)聯(lián)函數(shù)調(diào)用煞额,就會檢查一次這個標記,然后中斷自己赤屋,把自己加到隊列末尾立镶,執(zhí)行下一個G。如果沒有遇到非內(nèi)聯(lián)函數(shù)(有時候正常的小函數(shù)會被優(yōu)化成內(nèi)聯(lián)函數(shù))調(diào)用的話类早,那就慘了媚媒,會一直執(zhí)行這個G任務,直到它自己結(jié)束涩僻;如果是個死循環(huán)缭召,并且GOMAXPROCS=1的話,恭喜你逆日,夯住了嵌巷!親測,的確如此室抽。

4搪哪,一個G由于調(diào)度被中斷,此后如何恢復坪圾?
中斷的時候?qū)⒓拇嫫骼锏臈P畔⑾郏4娴阶约旱腉對象里面。當再次輪到自己執(zhí)行時兽泄,將自己保存的棧信息復制到寄存器里面漓概,這樣就接著上次之后運行了。 (≧▽≦)/
————————————————
版權聲明:本文為CSDN博主「jigetage」的原創(chuàng)文章病梢,遵循CC 4.0 BY-SA版權協(xié)議胃珍,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jigetage/java/article/details/103350180

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜓陌,一起剝皮案震驚了整個濱河市觅彰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌护奈,老刑警劉巖缔莲,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霉旗,居然都是意外死亡痴奏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門厌秒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來读拆,“玉大人,你說我怎么就攤上這事鸵闪¢茉危” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵蚌讼,是天一觀的道長辟灰。 經(jīng)常有香客問我,道長篡石,這世上最難降的妖魔是什么芥喇? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮凰萨,結(jié)果婚禮上继控,老公的妹妹穿的比我還像新娘。我一直安慰自己胖眷,他們只是感情好武通,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著珊搀,像睡著了一般冶忱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上境析,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天囚枪,我揣著相機與錄音,去河邊找鬼簿晓。 笑死眶拉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的憔儿。 我是一名探鬼主播忆植,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谒臼!你這毒婦竟也來了朝刊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蜈缤,失蹤者是張志新(化名)和其女友劉穎拾氓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體底哥,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡咙鞍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年房官,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片续滋。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡翰守,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疲酌,到底是詐尸還是另有隱情蜡峰,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布朗恳,位于F島的核電站湿颅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粥诫。R本人自食惡果不足惜油航,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臀脏。 院中可真熱鬧劝堪,春花似錦、人聲如沸揉稚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搀玖。三九已至余境,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灌诅,已是汗流浹背芳来。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猜拾,地道東北人即舌。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像挎袜,于是被迫代替她去往敵國和親顽聂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359