国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Golang goroutine MPG 模式淺析

這篇具有很好參考價(jià)值的文章主要介紹了Golang goroutine MPG 模式淺析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

goroutine-快速入門(mén)


快速入門(mén)小結(jié):
(1)主線程是一個(gè)物理線程,直接作用在cpu上的。是重量級(jí)的,非常耗費(fèi)cpu資源。
(2)協(xié)程從主線程開(kāi)局的,是輕量級(jí)的線程,是邏輯態(tài),對(duì)資源消耗相對(duì)小。
(3)Golang的協(xié)程機(jī)制是重要的特點(diǎn),可以輕松的開(kāi)啟上萬(wàn)個(gè)協(xié)程。其它編程語(yǔ)言的并發(fā)機(jī)制是一般基于線程的,開(kāi)啟過(guò)多的線程,資源耗費(fèi)大,這里就突顯Golang在并發(fā)上的優(yōu)勢(shì)了

協(xié)程是通過(guò)使用關(guān)鍵字 go 調(diào)用(或執(zhí)行)一個(gè)函數(shù)或者方法來(lái)實(shí)現(xiàn)的(也可以是匿名函數(shù))。

?Go 語(yǔ)言在語(yǔ)言層面上支持了并發(fā),goroutine是Go語(yǔ)言提供的一種用戶態(tài)線程,有時(shí)我們也稱(chēng)之為協(xié)程。

所謂的協(xié)程,某種程度上也可以叫做輕量線程,它不由os而由應(yīng)用程序創(chuàng)建和管理,因此使用開(kāi)銷(xiāo)較低(一般為4K)。

我們可以創(chuàng)建很多的goroutine,并且它們跑在同一個(gè)內(nèi)核線程之上的時(shí)候,就需要一個(gè)調(diào)度器來(lái)維護(hù)這些goroutine,確保所有的goroutine都能使用cpu,并且是盡可能公平地使用cpu資源。

調(diào)度器的主要有4個(gè)重要部分,分別是M、G、P、Sched,前三個(gè)定義在runtime.h中,Sched定義在proc.c中。

  • M (work thread) 代表了系統(tǒng)線程O(píng)S Thread,由操作系統(tǒng)管理。

  • P (processor) 銜接M和G的調(diào)度上下文,它負(fù)責(zé)將等待執(zhí)行的G與M對(duì)接。P的數(shù)量可以通過(guò)GOMAXPROCS()來(lái)設(shè)置,它其實(shí)也就代表了真正的并發(fā)度,即有多少個(gè)goroutine可以同時(shí)運(yùn)行。

  • G (goroutine) goroutine的實(shí)體,包括了調(diào)用棧,重要的調(diào)度信息,例如channel等。

在操作系統(tǒng)的OS Thread和編程語(yǔ)言的User Thread之間,實(shí)際上存在3種線程對(duì)應(yīng)模型,也就是:1:1,1:N,M:N。

  • N:1? ? ? 多個(gè)(N)用戶線程始終在一個(gè)內(nèi)核線程上跑,context上下文切換很快,但是無(wú)法真正的利用多核。
  • 1:1? ? ? 一個(gè)用戶線程就只在一個(gè)內(nèi)核線程上跑,這時(shí)可以利用多核,但是上下文切換很慢,切換效率很低。
  • M:N? ? ? 多個(gè)goroutine在多個(gè)內(nèi)核線程上跑,這個(gè)可以集齊上面兩者的優(yōu)勢(shì),但是無(wú)疑增加了調(diào)度的難度。

M:N 綜合兩種方式(N:1,1:1)的優(yōu)勢(shì)。多個(gè) goroutines 可以在多個(gè) OS threads 上處理。既能快速切換上下文,也能利用多核的優(yōu)勢(shì),而Go正是選擇這種實(shí)現(xiàn)方式。

MPG是其調(diào)度模型


M:可以理解為主線程,它是一個(gè)物理級(jí)別的線程,它比較耗費(fèi)資源。

p:可以理解為在整個(gè)執(zhí)行過(guò)程當(dāng)中的上下文環(huán)境,上下文環(huán)境可以簡(jiǎn)單理解為運(yùn)行時(shí)候所需要的資源或者當(dāng)時(shí)操作系統(tǒng)的一個(gè)狀態(tài)。

在主線程運(yùn)行的過(guò)程當(dāng)中,啟動(dòng)了一個(gè)協(xié)程,在協(xié)程起來(lái)的時(shí)候需要有一個(gè)上下文的環(huán)境。上下文環(huán)境就是是否cpu可分配,需要的資源和當(dāng)時(shí)運(yùn)行的狀態(tài)。

G:是協(xié)程

Golang goroutine MPG 模式淺析,Go Goroutines 和 Channels,golang

Golang goroutine MPG 模式淺析,Go Goroutines 和 Channels,golang

多個(gè)m作用在一個(gè)cpu,那么就是并發(fā),作用在多個(gè)cpu就是并行。可以看到M可以開(kāi)啟多個(gè)協(xié)程,形成一個(gè)隊(duì)列。

Go 語(yǔ)言中的goroutine是運(yùn)行在多核CPU中的(通過(guò)runtime.GOMAXPROCS(1)設(shè)定CPU核數(shù))。 實(shí)際中運(yùn)行的CPU核數(shù)未必會(huì)和實(shí)際物理CPU數(shù)相吻合。

每個(gè)goroutine都會(huì)被一個(gè)特定的P(某個(gè)CPU)選定維護(hù),而M(物理計(jì)算資源)每次挑選一個(gè)有效P,然后執(zhí)行P中的goroutine。

每個(gè)P會(huì)將自己所維護(hù)的goroutine放到一個(gè)G隊(duì)列中,其中就包括了goroutine堆棧信息,是否可執(zhí)行信息等等。

Golang goroutine MPG 模式淺析,Go Goroutines 和 Channels,golang

底層可能維護(hù)了線程池,線程池里面可能預(yù)留了M1,也可能沒(méi)有。這個(gè)就和操作系統(tǒng)底層相關(guān)了,如果有就將M1拿出來(lái)并且喚醒他,讓其工作,如果沒(méi)有那么就創(chuàng)建。

這里創(chuàng)建的M1線程可能就在其他cpu上了,有點(diǎn)像并行。

協(xié)程可以運(yùn)行在操作系統(tǒng)多個(gè)線程之間,也可以運(yùn)行在線程之內(nèi),讓你可以很小的內(nèi)存占用就可以處理大量的任務(wù)。由于操作系統(tǒng)線程上的協(xié)程時(shí)間片,你可以使用少量的操作系統(tǒng)線程就能擁有任意多個(gè)提供服務(wù)的協(xié)程,而且 Go 運(yùn)行時(shí)可以聰明的意識(shí)到哪些協(xié)程被阻塞了,暫時(shí)擱置它們并處理其他協(xié)程。

MPG并發(fā)模型?

Golang goroutine MPG 模式淺析,Go Goroutines 和 Channels,golang

?

總結(jié)


M代表主線程向下執(zhí)行,p上下文可以根據(jù)系統(tǒng)情況開(kāi)啟協(xié)程去工作。M可能有很多,可能全部在一個(gè)CPU上面,也可能每個(gè)M都在各個(gè)不同的CPU上面,這樣就叫做并行。

當(dāng)有協(xié)程被阻塞的時(shí)候,它有來(lái)回切換的一種機(jī)制,可以保證主線程的執(zhí)行,也能夠讓排隊(duì)的G協(xié)程得到執(zhí)行的機(jī)會(huì)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-712682.html

到了這里,關(guān)于Golang goroutine MPG 模式淺析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包