Golang協(xié)程調(diào)度器

說在前面

Golang作為Google親自孵化出來一門現(xiàn)代編程語言种樱,可以說是吸收了眾多早期編程語言的優(yōu)點,又有其自己獨特的設(shè)計哲學俊卤。由于其簡潔的編程風格和優(yōu)秀的并發(fā)編程效率嫩挤,越來越多精通C++和Java的同學把Go作為自己第二,甚至是第一語言消恍。本文打算從Go調(diào)度器(Go Scheduler)的角度討論下Go的并發(fā)編程岂昭。


Go調(diào)度器全貌

正文

什么是并行(Parallel)?

在同一時刻狠怨,多件事情一起做约啊。

什么叫并發(fā)處理(Concorrent)?

在一個時段內(nèi)佣赖,多件事情一起做恰矩。

舉個例子就是火影忍者中的鳴人影分身后產(chǎn)生的兩個鳴人是并行,本質(zhì)上產(chǎn)生了兩個獨立的鳴人茵汰;而七龍珠中孫悟空通過超高速移動產(chǎn)生兩個殘影是并發(fā)枢里,本質(zhì)上悟空還是只有一個孽鸡,只是本尊以超高速移動將時間片分配在兩個影子上蹂午。

并行和并發(fā)怎么體現(xiàn)在計算機中?

先談?wù)劜l(fā)彬碱,在計算機還是單處理器的時候豆胸,如果要同時運行兩個程序A和B,計算機將CPU的時間切成非常細小的片巷疼,這一個時間片去執(zhí)行程序A晚胡,第二個時間片去執(zhí)行程序B,只要時間片切換得非常快估盘,對于使用計算機的人來說A和B像是在同時運行瓷患,但在同一個時間片內(nèi)部,CPU只能處理程序A或者程序B遣妥。

再聊聊并發(fā)擅编,人們發(fā)現(xiàn)單處理器的時鐘頻率很難提升,如果同時運行100個程序箫踩,由于切換速度不夠快爱态,每個程序分到時間片的頻率太低,表現(xiàn)上來看每一個程序都會變慢境钟。既然處理器太少了锦担,那么,就多加幾個處理器慨削,100個任務(wù)就最多有n個同時在運行洞渔,使用者會感覺到程序變快。

現(xiàn)代計算機理盆,n個線程可以依附在n個獨立的CPU核心上同時(并行)計算痘煤。但是CPU核心非常貴,所以常見的計算機也就4-32核猿规。

Golang沒有設(shè)置線程數(shù)量的API衷快,調(diào)度器在并發(fā)編程上是怎么設(shè)計的?

Go調(diào)度器引入了新的并發(fā)單位——協(xié)程(goroutine)

Go底層的執(zhí)行還是依賴于內(nèi)核級的線程姨俩,但是Go程序中并發(fā)單元的調(diào)度蘸拔,都由調(diào)度器來調(diào)度,顯然环葵,底層需要開多少個線程调窍,也是Go調(diào)度器基于某些策略動態(tài)決定的。具體是什么樣的策略张遭,后續(xù)會聊到邓萨。

所以,Go程序本質(zhì)上的性能的好壞菊卷,與Go調(diào)度器的策略算法有非常大的關(guān)系缔恳。既要避免線程開太多,頻繁上下文切換消耗時間洁闰。也要避免線程數(shù)量不夠歉甚,導致無法充分利用多核優(yōu)勢。

協(xié)程與線程有怎么樣的關(guān)系扑眉?

M: Machine纸泄,可以簡單理解為內(nèi)核級線程赖钞,M與線程數(shù)量1:1

G: Goroutine,協(xié)程

P: Processor聘裁,處理器雪营,每個P協(xié)調(diào)n個G在某一個M上執(zhí)行『獗悖可以通過GOMAXPROCS設(shè)置P的個數(shù)卓缰。GOMAXPROCS表示最多有多少個G可以并行。

協(xié)程的阻塞有哪些情況砰诵?

Gwaitting. 內(nèi)部channel或者mutex阻塞
Gsyscall. 調(diào)用了syscall(沒有事件準備的Nonblocking IO除外)

G處于Gruning狀態(tài)征唬,調(diào)度器會怎么處理其它待執(zhí)行的G?

image.png

時間片到了茁彭,自然會出讓線程資源

G如果因為Gwaitting而阻塞了总寒,調(diào)度器會怎么處理其它待執(zhí)行的G?

image.png

G阻塞后理肺,立刻把執(zhí)行權(quán)給隊首的G

G如果因為Gsyscall而阻塞了摄闸,調(diào)度器會怎么處理其它待執(zhí)行的G?

調(diào)度器斷開阻塞的M和當前P之間的關(guān)聯(lián)妹萨,找到新創(chuàng)建的M年枕,將P與之建立聯(lián)系,從P中可運行G列表取出新的G乎完,放在新的M中執(zhí)行熏兄。

image.png

分成兩種情況

  • 沒有空閑的M。
    如果這個時候可運行的G的隊列特別長树姨,所有的M都因為Gsyscall阻塞了摩桶,調(diào)度器為了防止系統(tǒng)整個無法工作,將創(chuàng)建與G同等數(shù)量的線程帽揪。

  • 有空閑的M
    由于在第一種情況下硝清,會產(chǎn)生很多線程,當G的任務(wù)執(zhí)行完后转晰,這些線程(Thread-M)就空閑下來了芦拿。

結(jié)合以上描述,
一個線程什么時候獲得CPU時間查邢,能夠運行多久蔗崎,是由OS線程調(diào)度器根據(jù)某種調(diào)度策略所定。這個是線程調(diào)度器侠坎。

類似得蚁趁,
一個協(xié)程什么時候獲得線程的時間裙盾,能夠占用線程運行多久实胸,就是Go調(diào)度器根據(jù)某種調(diào)度策略所定他嫡。這個是Go調(diào)度器。

說在后面

如果喜歡本文庐完,請收藏后點個贊钢属,咱們江湖再見。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末门躯,一起剝皮案震驚了整個濱河市淆党,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讶凉,老刑警劉巖染乌,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異懂讯,居然都是意外死亡荷憋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門褐望,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勒庄,“玉大人,你說我怎么就攤上這事瘫里∈当危” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵谨读,是天一觀的道長局装。 經(jīng)常有香客問我,道長劳殖,這世上最難降的妖魔是什么贼邓? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮闷尿,結(jié)果婚禮上塑径,老公的妹妹穿的比我還像新娘。我一直安慰自己填具,他們只是感情好统舀,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著劳景,像睡著了一般誉简。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盟广,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天闷串,我揣著相機與錄音,去河邊找鬼筋量。 笑死烹吵,一個胖子當著我的面吹牛碉熄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肋拔,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼锈津,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凉蜂?” 一聲冷哼從身側(cè)響起琼梆,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窿吩,沒想到半個月后茎杂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡纫雁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年蛉顽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片先较。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡携冤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闲勺,到底是詐尸還是另有隱情曾棕,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布菜循,位于F島的核電站翘地,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏癌幕。R本人自食惡果不足惜衙耕,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勺远。 院中可真熱鬧橙喘,春花似錦、人聲如沸胶逢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽初坠。三九已至和簸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碟刺,已是汗流浹背锁保。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爽柒。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓吴菠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霉赡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345