golang協(xié)程為什么比線程輕量?

先理解下進程斤儿、線程跟協(xié)程的概念:

進程
?? 計算機的操作系統(tǒng)模式是一種多任務(wù)系統(tǒng),操作系統(tǒng)接管了所有的硬件資源腮考,并且本身運行在一個受硬件保護的級別雇毫。所有的應(yīng)用程序都以進程(process)的方式運行在比操作系統(tǒng)權(quán)限更低的級別,每個進程都有自己獨立的地址空間踩蔚,使得進程之間的地址空間相互隔離棚放。CPU由操作系統(tǒng)統(tǒng)一進行分配,每個進程根據(jù)進程的優(yōu)先級的高低都有機會得到CPU,但是如果允許時間超出了一定的時間馅闽,操作系統(tǒng)會暫停該進程飘蚯,將CPU資源分配給其他等待的進程。這種CPU的分配方式即所謂的搶占式福也,操作系統(tǒng)可以強制剝奪CPU資源并且分配給它認為目前最需要的進程局骤。如果操作系統(tǒng)分配給每個進程的時間都很短,即CPU在多個進程間快速地切換暴凑,從而造成了很多進程都在同時運行的假象峦甩。

線程
??線程有時被稱為輕量級進程(Lightweight Process),是程序執(zhí)行流的最小單元,一個標(biāo)準(zhǔn)的線程由線程ID,當(dāng)前指令指針(PC)现喳、寄存器集合和堆棧組成凯傲,通常意義上,一個進程??一個到多個線程組成嗦篱,各個線程之間共享程序的內(nèi)存空間(包括代碼段冰单、數(shù)據(jù)段、堆等)及一些進程級的資源(如打開文件和信號)灸促。一個經(jīng)典的線程與進程的關(guān)系如圖1-8所示:

image.png

go協(xié)程
??協(xié)程(coroutine)是Go語言中的輕量級線程實現(xiàn)诫欠,由Go運行時(runtime)管理涵卵。

進程、線程荒叼、協(xié)程的關(guān)系和區(qū)別:

  • 進程擁有自己獨立的堆和棧轿偎,既不共享堆,亦不共享棧甩挫,進程由操作系統(tǒng)調(diào)度贴硫。

  • 線程擁有自己獨立的棧和共享的堆,共享堆伊者,不共享棧英遭,線程亦由操作系統(tǒng)調(diào)度(標(biāo)準(zhǔn)線程是的)。

  • 協(xié)程和線程一樣共享堆亦渗,不共享棧挖诸,協(xié)程由程序員在協(xié)程的代碼里顯示調(diào)度。

并發(fā)與并行(Concurrency and Parallelism)

??并發(fā)是指程序的邏輯結(jié)構(gòu)法精。非并發(fā)的程序就是一根竹竿捅到底多律,只有一個邏輯控制流,也就是順序執(zhí)行的(Sequential)程序搂蜓,在任何時刻狼荞,程序只會處在這個邏輯控制流的某個位置。而如果某個程序有多個獨立的邏輯控制流帮碰,也就是可以同時處理(deal)多件事情相味,我們就說這個程序是并發(fā)的。這里的“同時”殉挽,并不一定要是真正在時鐘的某一時刻(那是運行狀態(tài)而不是邏輯結(jié)構(gòu))丰涉,而是指:如果把這些邏輯控制流畫成時序流程圖,它們在時間線上是可以重疊的斯碌。

??并行是指程序的運行狀態(tài)一死。如果一個程序在某一時刻被多個CPU流水線同時進行處理,那么我們就說這個程序是以并行的形式在運行傻唾。(嚴(yán)格意義上講投慈,我們不能說某程序是“并行”的,因為“并行”不是描述程序本身冠骄,而是描述程序的運行狀態(tài)伪煤,但這篇小文里就不那么咬文嚼字,以下說到“并行”的時候猴抹,就是指代“以并行的形式運行”)顯然,并行一定是需要硬件支持的锁荔。

??而且不難理解:

    1. 并發(fā)是并行的必要條件蟀给,如果一個程序本身就不是并發(fā)的蝙砌,也就是只有一個邏輯控制流,那么我們不可能讓其被并行處理跋理。
    1. 并發(fā)不是并行的充分條件择克,一個并發(fā)的程序,如果只被一個CPU流水線進行處理(通過分時)前普,那么它就不是并行的肚邢。

為什么協(xié)程比線程輕量?

    1. go協(xié)程調(diào)用跟切換比線程效率高

線程并發(fā)執(zhí)行流程:
??線程是內(nèi)核對外提供的服務(wù)拭卿,應(yīng)用程序可以通過系統(tǒng)調(diào)用讓內(nèi)核啟動線程骡湖,由內(nèi)核來負責(zé)線程調(diào)度和切換。線程在等待IO操作時線程變?yōu)閡nrunnable狀態(tài)會觸發(fā)上下文切換【瘢現(xiàn)代操作系統(tǒng)一般都采用搶占式調(diào)度响蕴,上下文切換一般發(fā)生在時鐘中斷和系統(tǒng)調(diào)用返回前,調(diào)度器計算當(dāng)前線程的時間片惠桃,如果需要切換就從運行隊列中選出一個目標(biāo)線程浦夷,保存當(dāng)前線程的環(huán)境,并且恢復(fù)目標(biāo)線程的運行環(huán)境辜王,最典型的就是切換ESP指向目標(biāo)線程內(nèi)核堆棧劈狐,將EIP指向目標(biāo)線程上次被調(diào)度出時的指令地址。

go協(xié)程并發(fā)執(zhí)行流程:
??不依賴操作系統(tǒng)和其提供的線程呐馆,golang自己實現(xiàn)的CSP并發(fā)模型實現(xiàn):M, P, G
??go協(xié)程也叫用戶態(tài)線程肥缔,協(xié)程之間的切換發(fā)生在用戶態(tài)。在用戶態(tài)沒有時鐘中斷摹恰,系統(tǒng)調(diào)用等機制,因此效率高

  • 2.go協(xié)程占用內(nèi)存少

??執(zhí)行g(shù)o協(xié)程只需要極少的棧內(nèi)存(大概是4~5KB)辫继,默認情況下,線程棧的大小為1MB俗慈。
??goroutine就是一段代碼姑宽,一個函數(shù)入口,以及在堆上為其分配的一個堆棧闺阱。所以它非常廉價炮车,我們可以很輕松的創(chuàng)建上萬個goroutine,但它們并不是被操作系統(tǒng)所調(diào)度執(zhí)行酣溃。

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘦穆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赊豌,更是在濱河造成了極大的恐慌扛或,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碘饼,死亡現(xiàn)場離奇詭異熙兔,居然都是意外死亡悲伶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門住涉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麸锉,“玉大人,你說我怎么就攤上這事舆声』ǔ粒” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵媳握,是天一觀的道長碱屁。 經(jīng)常有香客問我,道長毙芜,這世上最難降的妖魔是什么忽媒? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮腋粥,結(jié)果婚禮上晦雨,老公的妹妹穿的比我還像新娘。我一直安慰自己隘冲,他們只是感情好闹瞧,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著展辞,像睡著了一般奥邮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罗珍,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天洽腺,我揣著相機與錄音,去河邊找鬼覆旱。 笑死蘸朋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扣唱。 我是一名探鬼主播藕坯,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼噪沙!你這毒婦竟也來了炼彪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤正歼,失蹤者是張志新(化名)和其女友劉穎辐马,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體局义,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡喜爷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年膜楷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贞奋。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖穷绵,靈堂內(nèi)的尸體忽然破棺而出轿塔,到底是詐尸還是另有隱情,我是刑警寧澤仲墨,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布勾缭,位于F島的核電站,受9級特大地震影響目养,放射性物質(zhì)發(fā)生泄漏俩由。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一癌蚁、第九天 我趴在偏房一處隱蔽的房頂上張望幻梯。 院中可真熱鬧,春花似錦努释、人聲如沸碘梢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煞躬。三九已至,卻和暖如春逸邦,著一層夾襖步出監(jiān)牢的瞬間恩沛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工缕减, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雷客,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓烛卧,卻偏偏與公主長得像佛纫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子总放,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容