[GoLang]協(xié)程基本概念

groutine與OS線程:

????????groutine?開啟得是用戶態(tài)得線程

????????OS線程指得是操作系統(tǒng)得線程

????????OS線程(操作系統(tǒng)線程)一般都有固定的棧內(nèi)存?(通常為2MB),一個(gè)goroutine的棧在其生命周期開始時(shí)只有

????????很小的棧(典型情況下為2KB)?,goroutine?的棧不市固定的,他可以按需增大和縮小。goroutine的棧的大小限制

????????可以達(dá)到1GB,雖然極少會用到那么大。所以在Go語言中一次創(chuàng)建十萬左右的goroutine?也是可以的。

groutine得調(diào)度:

????GPM是GO語言運(yùn)行時(shí)(runtime)層面得實(shí)現(xiàn),是go語言自己實(shí)現(xiàn)得一套調(diào)度系統(tǒng)?區(qū)別于操作系統(tǒng)調(diào)度得OS線程

? ? G:指得是goroutine?里面除了存放本goroutine得信息外?還有于所在P得綁定等信息

? ? M:(machine)?是go運(yùn)行時(shí)(runtime)?對于操作系統(tǒng)內(nèi)核線程的虛擬,?M與操作系統(tǒng)內(nèi)核線程一般是——映射的關(guān)系,一個(gè)

? ? goroutine?最終是需要放在M上執(zhí)行的。

? ? P:管理著一組goroutine隊(duì)列,P里面會存儲當(dāng)前goroutine運(yùn)行的上下文環(huán)境(函數(shù)指針?堆棧地址及地址邊界),P會

? ? 對自己管理的goroutine隊(duì)列做一些調(diào)度(比如把占用CPU時(shí)間較長的goroutine暫停,運(yùn)行后續(xù)的goroutine等等)?當(dāng)

? ? 自己隊(duì)列里的goroutine消費(fèi)完了?就去全局隊(duì)列里取,如果全局隊(duì)列里的也消費(fèi)完了?會去其他P的隊(duì)列里搶任務(wù)。

? ? P與M一般也是一一對應(yīng)的。他們的關(guān)系是P管理著一組G掛載在M上運(yùn)行。當(dāng)一個(gè)G長久阻塞在一個(gè)M上時(shí),runtime?會新建一個(gè)

? ? M,阻塞G所在的P會把其他的G掛載在新建的M上。當(dāng)舊的G阻塞完成或者認(rèn)為其已經(jīng)死掉時(shí),會回收舊的M。

? ? P的個(gè)數(shù)市通過runtime.GOMAXPROCS設(shè)定(最大256);GO1.5版本以后默認(rèn)為物理線程數(shù)。在并發(fā)量大的時(shí)候會增加一些P和M,

? ? 但也不會太多。切換太頻繁的話會得不償失。

? ? 單從線程調(diào)度上講,GO語言相對比起其他語言的優(yōu)勢在于OS線程是由OS內(nèi)核來調(diào)度的,goroutine?則是由GO運(yùn)行時(shí)(runtime)自己的

? ? 調(diào)度器調(diào)度的。這個(gè)調(diào)度器使用一個(gè)稱為m:n調(diào)度的技術(shù)(復(fù)用/調(diào)度m個(gè)goroutine到n個(gè)OS線程)。其一大特點(diǎn)是goroutine的調(diào)是

? ? 在用戶態(tài)下完成的,不涉及用戶態(tài)和內(nèi)存態(tài)之間的頻繁切換,包括內(nèi)存的分配與釋放,都是在用戶態(tài)維護(hù)著一塊大內(nèi)存池,不直接調(diào)用系

? ? 統(tǒng)的malloc函數(shù)(除非內(nèi)存池需要改變),成本比調(diào)度OS線程低很多。另一方面充分利用了多核的硬件資源,近似的把若干goroutin均

????分在物理線程上,再加上本身goroutine的超輕量,以上保證了GO調(diào)度放命的性能。

GOMAXPROCS:

???GO運(yùn)行的時(shí)候的調(diào)度器使用GOMAXPROCS參數(shù)來確定需要使用多少個(gè)OS線程來同時(shí)執(zhí)行GO代碼。默認(rèn)值是機(jī)器上的CPU核心數(shù)。

? ?列如再一個(gè)8核心的機(jī)器上,調(diào)度器會把Go代碼同時(shí)調(diào)度到8個(gè)OS線程上(GOMAXPROCS是m:n中的n)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

  • 我們的程序是如何被運(yùn)行的? 學(xué)習(xí)過操作系統(tǒng)的人,應(yīng)該對進(jìn)程和線程的模型都是有所了解的。按照我的理解:「進(jìn)程」是操作...
    最近有點(diǎn)懶閱讀 3,097評論 1 7
  • 進(jìn)程時(shí)代 后來,現(xiàn)代化的計(jì)算機(jī)有了操作系統(tǒng),每個(gè)程序都是一個(gè)進(jìn)程,但是操作系統(tǒng)在一段時(shí)間只能運(yùn)行一個(gè)進(jìn)程,直到這個(gè)...
    大學(xué)渣PG閱讀 1,996評論 0 1
  • 前言 隨著服務(wù)器硬件迭代升級,配置也越來越高。為充分利用服務(wù)器資源,并發(fā)編程也變的越來越重要。在開始之前,需要了解...
    云爬蟲技術(shù)研究筆記閱讀 3,892評論 0 7
  • 1、并發(fā)與并行 并行(parallel):指在同一時(shí)刻,有多條指令在多個(gè)處理器上同時(shí)執(zhí)行。并發(fā)(concurren...
    lesline閱讀 9,883評論 0 2
  • 小差路之廣州從化的天堂頂?shù)巧交顒?dòng)算是自己的第一次戶外活動(dòng),還算挺有意思的。之所以覺得挺有意思,而不是很有意思是因?yàn)?..
    眼鏡蛇要飛閱讀 669評論 0 0

友情鏈接更多精彩內(nèi)容