亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁(yè) > 知識(shí)庫(kù) > 淺談Go語(yǔ)言并發(fā)機(jī)制

淺談Go語(yǔ)言并發(fā)機(jī)制

熱門標(biāo)簽:建造者2地圖標(biāo)注 阿里云ai電話機(jī)器人 浙江高頻外呼系統(tǒng)多少錢一個(gè)月 惠州電銷防封電話卡 釘釘有地圖標(biāo)注功能嗎 黃岡人工智能電銷機(jī)器人哪個(gè)好 汕頭小型外呼系統(tǒng) 濱州自動(dòng)電銷機(jī)器人排名 鄭州亮點(diǎn)科技用的什么外呼系統(tǒng)

Go 語(yǔ)言相比Java等一個(gè)很大的優(yōu)勢(shì)就是可以方便地編寫并發(fā)程序。Go 語(yǔ)言內(nèi)置了 goroutine 機(jī)制,使用goroutine可以快速地開發(fā)并發(fā)程序, 更好的利用多核處理器資源。這篇文章學(xué)習(xí)goroutine 的應(yīng)用及其調(diào)度實(shí)現(xiàn)。

一、Go語(yǔ)言對(duì)并發(fā)的支持

使用goroutine編程

使用 go 關(guān)鍵字用來(lái)創(chuàng)建 goroutine 。將go聲明放到一個(gè)需調(diào)用的函數(shù)之前,在相同地址空間調(diào)用運(yùn)行這個(gè)函數(shù),這樣該函數(shù)執(zhí)行時(shí)便會(huì)作為一個(gè)獨(dú)立的并發(fā)線程。這種線程在Go語(yǔ)言中稱作goroutine。

goroutine的用法如下:

//go 關(guān)鍵字放在方法調(diào)用前新建一個(gè) goroutine 并執(zhí)行方法體

go GetThingDone(param1, param2);

 

//新建一個(gè)匿名方法并執(zhí)行

go func(param1, param2) {

}(val1, val2)

 

//直接新建一個(gè) goroutine 并在 goroutine 中執(zhí)行代碼塊

go {

  //do someting...

} 

因?yàn)?goroutine 在多核 cpu 環(huán)境下是并行的。如果代碼塊在多個(gè) goroutine 中執(zhí)行,我們就實(shí)現(xiàn)了代碼并行。

如果需要了解程序的執(zhí)行情況,怎么拿到并行的結(jié)果呢?需要配合使用channel進(jìn)行。

使用Channel控制并發(fā)

Channels用來(lái)同步并發(fā)執(zhí)行的函數(shù)并提供它們某種傳值交流的機(jī)制。

通過(guò)channel傳遞的元素類型、容器(或緩沖區(qū))和傳遞的方向由“-”操作符指定。

可以使用內(nèi)置函數(shù) make分配一個(gè)channel:

i := make(chan int)    // by default the capacity is 0

s := make(chan string, 3) // non-zero capacity

 

r := make(-chan bool)     // can only read from

w := make(chan- []os.FileInfo) // can only write to 

配置runtime.GOMAXPROCS

使用下面的代碼可以顯式的設(shè)置是否使用多核來(lái)執(zhí)行并發(fā)任務(wù):

runtime.GOMAXPROCS()

GOMAXPROCS的數(shù)目根據(jù)任務(wù)量分配就可以,但是不要大于cpu核數(shù)。

配置并行執(zhí)行比較適合適合于CPU密集型、并行度比較高的情景,如果是IO密集型使用多核的化會(huì)增加cpu切換帶來(lái)的性能損失。

了解了Go語(yǔ)言的并發(fā)機(jī)制,接下來(lái)看一下goroutine 機(jī)制的具體實(shí)現(xiàn)。

二、區(qū)別并行與并發(fā)

進(jìn)程、線程與處理器

在現(xiàn)代操作系統(tǒng)中,線程是處理器調(diào)度和分配的基本單位,進(jìn)程則作為資源擁有的基本單位。每個(gè)進(jìn)程是由私有的虛擬地址空間、代碼、數(shù)據(jù)和其它各種系統(tǒng)資源組成。線程是進(jìn)程內(nèi)部的一個(gè)執(zhí)行單元。 每一個(gè)進(jìn)程至少有一個(gè)主執(zhí)行線程,它無(wú)需由用戶去主動(dòng)創(chuàng)建,是由系統(tǒng)自動(dòng)創(chuàng)建的。 用戶根據(jù)需要在應(yīng)用程序中創(chuàng)建其它線程,多個(gè)線程并發(fā)地運(yùn)行于同一個(gè)進(jìn)程中。

并行與并發(fā)

并行與并發(fā)(Concurrency and Parallelism)是兩個(gè)不同的概念,理解它們對(duì)于理解多線程模型非常重要。

在描述程序的并發(fā)或者并行時(shí),應(yīng)該說(shuō)明從進(jìn)程或者線程的角度出發(fā)。

  1. 并發(fā):一個(gè)時(shí)間段內(nèi)有很多的線程或進(jìn)程在執(zhí)行,但何時(shí)間點(diǎn)上都只有一個(gè)在執(zhí)行,多個(gè)線程或進(jìn)程爭(zhēng)搶時(shí)間片輪流執(zhí)行
  2. 并行:一個(gè)時(shí)間段和時(shí)間點(diǎn)上都有多個(gè)線程或進(jìn)程在執(zhí)行

非并發(fā)的程序只有一個(gè)垂直的控制邏輯,在任何時(shí)刻,程序只會(huì)處在這個(gè)控制邏輯的某個(gè)位置,也就是順序執(zhí)行。如果一個(gè)程序在某一時(shí)刻被多個(gè)CPU流水線同時(shí)進(jìn)行處理,那么我們就說(shuō)這個(gè)程序是以并行的形式在運(yùn)行。

并行需要硬件支持,單核處理器只能是并發(fā),多核處理器才能做到并行執(zhí)行。

  1. 并發(fā)是并行的必要條件,如果一個(gè)程序本身就不是并發(fā)的,也就是只有一個(gè)邏輯執(zhí)行順序,那么我們不可能讓其被并行處理。
  2. 并發(fā)不是并行的充分條件,一個(gè)并發(fā)的程序,如果只被一個(gè)CPU進(jìn)行處理(通過(guò)分時(shí)),那么它就不是并行的。

舉一個(gè)例子,編寫一個(gè)最簡(jiǎn)單的順序結(jié)構(gòu)程序輸出"Hello World",它就是非并發(fā)的,如果在程序中增加多線程,每個(gè)線程打印一個(gè)"Hello World",那么這個(gè)程序就是并發(fā)的。如果運(yùn)行時(shí)只給這個(gè)程序分配單個(gè)CPU,這個(gè)并發(fā)程序還不是并行的,需要部署在多核處理器上,才能實(shí)現(xiàn)程序的并行。

三、幾種不同的多線程模型

用戶線程與內(nèi)核級(jí)線程

線程的實(shí)現(xiàn)可以分為兩類:用戶級(jí)線程(User-LevelThread, ULT)和內(nèi)核級(jí)線程(Kemel-LevelThread, KLT)。用戶線程由用戶代碼支持,內(nèi)核線程由操作系統(tǒng)內(nèi)核支持。

多線程模型

多線程模型即用戶級(jí)線程和內(nèi)核級(jí)線程的不同連接方式。

(1)多對(duì)一模型(M : 1)

將多個(gè)用戶級(jí)線程映射到一個(gè)內(nèi)核級(jí)線程,線程管理在用戶空間完成。 此模式中,用戶級(jí)線程對(duì)操作系統(tǒng)不可見(即透明)。

優(yōu)點(diǎn): 這種模型的好處是線程上下文切換都發(fā)生在用戶空間,避免的模態(tài)切換(mode switch),從而對(duì)于性能有積極的影響。

缺點(diǎn):所有的線程基于一個(gè)內(nèi)核調(diào)度實(shí)體即內(nèi)核線程,這意味著只有一個(gè)處理器可以被利用,在多處理器環(huán)境下這是不能夠被接受的,本質(zhì)上,用戶線程只解決了并發(fā)問題,但是沒有解決并行問題。如果線程因?yàn)?I/O 操作陷入了內(nèi)核態(tài),內(nèi)核態(tài)線程阻塞等待 I/O 數(shù)據(jù),則所有的線程都將會(huì)被阻塞,用戶空間也可以使用非阻塞而 I/O,但是不能避免性能及復(fù)雜度問題。

(2) 一對(duì)一模型(1:1)

將每個(gè)用戶級(jí)線程映射到一個(gè)內(nèi)核級(jí)線程。

每個(gè)線程由內(nèi)核調(diào)度器獨(dú)立的調(diào)度,所以如果一個(gè)線程阻塞則不影響其他的線程。

優(yōu)點(diǎn):在多核處理器的硬件的支持下,內(nèi)核空間線程模型支持了真正的并行,當(dāng)一個(gè)線程被阻塞后,允許另一個(gè)線程繼續(xù)執(zhí)行,所以并發(fā)能力較強(qiáng)。

缺點(diǎn):每創(chuàng)建一個(gè)用戶級(jí)線程都需要?jiǎng)?chuàng)建一個(gè)內(nèi)核級(jí)線程與其對(duì)應(yīng),這樣創(chuàng)建線程的開銷比較大,會(huì)影響到應(yīng)用程序的性能。

(3)多對(duì)多模型(M : N)

內(nèi)核線程和用戶線程的數(shù)量比為 M : N,內(nèi)核用戶空間綜合了前兩種的優(yōu)點(diǎn)。

這種模型需要內(nèi)核線程調(diào)度器和用戶空間線程調(diào)度器相互操作,本質(zhì)上是多個(gè)線程被綁定到了多個(gè)內(nèi)核線程上,這使得大部分的線程上下文切換都發(fā)生在用戶空間,而多個(gè)內(nèi)核線程又可以充分利用處理器資源。

四、goroutine機(jī)制的調(diào)度實(shí)現(xiàn)

goroutine機(jī)制實(shí)現(xiàn)了M : N的線程模型,goroutine機(jī)制是協(xié)程(coroutine)的一種實(shí)現(xiàn),golang內(nèi)置的調(diào)度器,可以讓多核CPU中每個(gè)CPU執(zhí)行一個(gè)協(xié)程。

理解goroutine機(jī)制的原理,關(guān)鍵是理解Go語(yǔ)言scheduler的實(shí)現(xiàn)。

調(diào)度器是如何工作的

Go語(yǔ)言中支撐整個(gè)scheduler實(shí)現(xiàn)的主要有4個(gè)重要結(jié)構(gòu),分別是M、G、P、Sched, 前三個(gè)定義在runtime.h中,Sched定義在proc.c中。

  1. Sched結(jié)構(gòu)就是調(diào)度器,它維護(hù)有存儲(chǔ)M和G的隊(duì)列以及調(diào)度器的一些狀態(tài)信息等。
  2. M結(jié)構(gòu)是Machine,系統(tǒng)線程,它由操作系統(tǒng)管理的,goroutine就是跑在M之上的;M是一個(gè)很大的結(jié)構(gòu),里面維護(hù)小對(duì)象內(nèi)存cache(mcache)、當(dāng)前執(zhí)行的goroutine、隨機(jī)數(shù)發(fā)生器等等非常多的信息。
  3. P結(jié)構(gòu)是Processor,處理器,它的主要用途就是用來(lái)執(zhí)行g(shù)oroutine的,它維護(hù)了一個(gè)goroutine隊(duì)列,即runqueue。Processor是讓我們從N:1調(diào)度到M:N調(diào)度的重要部分。
  4. G是goroutine實(shí)現(xiàn)的核心結(jié)構(gòu),它包含了棧,指令指針,以及其他對(duì)調(diào)度goroutine很重要的信息,例如其阻塞的channel。

Processor的數(shù)量是在啟動(dòng)時(shí)被設(shè)置為環(huán)境變量GOMAXPROCS的值,或者通過(guò)運(yùn)行時(shí)調(diào)用函數(shù)GOMAXPROCS()進(jìn)行設(shè)置。Processor數(shù)量固定意味著任意時(shí)刻只有GOMAXPROCS個(gè)線程在運(yùn)行g(shù)o代碼。

參考這篇傳播很廣的博客:http://morsmachine.dk/go-scheduler

我們分別用三角形,矩形和圓形表示Machine Processor和Goroutine。

在單核處理器的場(chǎng)景下,所有g(shù)oroutine運(yùn)行在同一個(gè)M系統(tǒng)線程中,每一個(gè)M系統(tǒng)線程維護(hù)一個(gè)Processor,任何時(shí)刻,一個(gè)Processor中只有一個(gè)goroutine,其他goroutine在runqueue中等待。一個(gè)goroutine運(yùn)行完自己的時(shí)間片后,讓出上下文,回到runqueue中。 多核處理器的場(chǎng)景下,為了運(yùn)行g(shù)oroutines,每個(gè)M系統(tǒng)線程會(huì)持有一個(gè)Processor。

在正常情況下,scheduler會(huì)按照上面的流程進(jìn)行調(diào)度,但是線程會(huì)發(fā)生阻塞等情況,看一下goroutine對(duì)線程阻塞等的處理。

線程阻塞

當(dāng)正在運(yùn)行的goroutine阻塞的時(shí)候,例如進(jìn)行系統(tǒng)調(diào)用,會(huì)再創(chuàng)建一個(gè)系統(tǒng)線程(M1),當(dāng)前的M線程放棄了它的Processor,P轉(zhuǎn)到新的線程中去運(yùn)行。

runqueue執(zhí)行完成

當(dāng)其中一個(gè)Processor的runqueue為空,沒有g(shù)oroutine可以調(diào)度。它會(huì)從另外一個(gè)上下文偷取一半的goroutine。

五、對(duì)并發(fā)實(shí)現(xiàn)的進(jìn)一步思考

Go語(yǔ)言的并發(fā)機(jī)制還有很多值得探討的,比如Go語(yǔ)言和Scala并發(fā)實(shí)現(xiàn)的不同,Golang CSP 和Actor模型的對(duì)比等。

了解并發(fā)機(jī)制的這些實(shí)現(xiàn),可以幫助我們更好的進(jìn)行并發(fā)程序的開發(fā),實(shí)現(xiàn)性能的最優(yōu)化。

關(guān)于三種多線程模型,可以關(guān)注一下Java語(yǔ)言的實(shí)現(xiàn)。

我們知道Java通過(guò)JVM封裝了底層操作系統(tǒng)的差異,而不同的操作系統(tǒng)可能使用不同的線程模型,例如Linux和windows可能使用了一對(duì)一模型,solaris和unix某些版本可能使用多對(duì)多模型。JVM規(guī)范里沒有規(guī)定多線程模型的具體實(shí)現(xiàn),1:1(內(nèi)核線程)、N:1(用戶態(tài)線程)、M:N(混合)模型的任何一種都可以。談到Java語(yǔ)言的多線程模型,需要針對(duì)具體JVM實(shí)現(xiàn),比如Oracle/Sun的HotSpot VM,默認(rèn)使用1:1線程模型。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • golang實(shí)現(xiàn)并發(fā)數(shù)控制的方法

標(biāo)簽:阿壩 滄州 昭通 東營(yíng) 晉中 泰安 瀘州 駐馬店

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談Go語(yǔ)言并發(fā)機(jī)制》,本文關(guān)鍵詞  淺談,語(yǔ)言,并發(fā),機(jī)制,淺談,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談Go語(yǔ)言并發(fā)機(jī)制》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于淺談Go語(yǔ)言并發(fā)機(jī)制的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产高清在线精品一区二区| 国产91素人搭讪系列天堂| 青青青草视频在线观看| 国产麻豆精品免费视频| 日韩av成人| 999精品在线| 台湾美女古装一级毛片| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 一a一级片| 亚洲 激情| 天天做日日爱| 国产91素人搭讪系列天堂| 国产网站免费在线观看| 成人免费观看男女羞羞视频| 精品国产亚洲人成在线| 999精品在线| 天天做人人爱夜夜爽2020| 二级片在线观看| 日本免费区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产伦精品一区二区三区无广告 | 99热热久久| 国产精品免费久久| 四虎影视库国产精品一区| 国产成人女人在线视频观看| 欧美国产日韩在线| 香蕉视频一级| 精品国产亚洲人成在线| 一级毛片视频免费| 久久99爰这里有精品国产| 99热精品在线| 成人高清视频免费观看| 免费的黄色小视频| 亚洲天堂在线播放| 国产一区二区精品在线观看| 久久99中文字幕| 毛片的网站| 久久精品欧美一区二区| 中文字幕97| 99久久精品费精品国产一区二区| 国产精品自拍一区| 999久久狠狠免费精品| 国产伦精品一区二区三区在线观看 | 日本乱中文字幕系列| 欧美激情一区二区三区视频 | 欧美国产日韩精品| 国产不卡高清| 麻豆午夜视频| 尤物视频网站在线观看| 欧美另类videosbestsex视频| 韩国毛片 免费| 999精品影视在线观看| 日本免费区| 国产一区二区精品尤物| 国产网站在线| 日韩专区亚洲综合久久| 久久福利影视| 二级片在线观看| 韩国三级视频网站| 国产福利免费视频| 日韩中文字幕在线播放| 国产视频一区二区在线播放| 亚洲 激情| 日本免费乱人伦在线观看 | 香蕉视频一级| 可以免费看毛片的网站| 午夜在线亚洲| 精品视频一区二区| 美国一区二区三区| 久草免费资源| 99色吧| 国产麻豆精品| 一本高清在线| 在线观看成人网| 精品久久久久久综合网| 国产成人啪精品| 精品在线观看一区| 四虎久久影院| 高清一级毛片一本到免费观看| 日韩专区亚洲综合久久| 免费国产一级特黄aa大片在线| 麻豆网站在线免费观看| 国产韩国精品一区二区三区| 久久国产精品自线拍免费| 国产成人欧美一区二区三区的| 美女免费毛片| 成人a级高清视频在线观看| 国产精品自拍一区| 91麻豆精品国产自产在线| 二级片在线观看| 夜夜操网| 成人影院久久久久久影院| 日本免费看视频| 黄色免费三级| 香蕉视频久久| 国产91精品系列在线观看| 国产成人精品综合在线| 国产不卡在线观看视频| 午夜在线亚洲男人午在线| 日韩专区一区| 欧美激情一区二区三区视频| 中文字幕97| 欧美爱色| 午夜在线亚洲男人午在线| 国产成人欧美一区二区三区的| 亚飞与亚基在线观看| 中文字幕97| 国产不卡福利| 成人a大片高清在线观看| 国产麻豆精品免费密入口| 一级女性全黄生活片免费 | 青草国产在线观看| 九九九网站| 香蕉视频久久| 免费国产在线观看不卡| 欧美国产日韩在线| 亚洲精品影院久久久久久| 亚洲女初尝黑人巨高清在线观看| 国产亚洲精品aaa大片| 久久国产影院| 午夜激情视频在线播放| 日韩在线观看网站| 国产成人精品在线| 国产91精品系列在线观看| 日本特黄特色aaa大片免费| 国产精品自拍在线| 欧美大片一区| 99热精品在线| 欧美激情一区二区三区视频 | 国产麻豆精品hdvideoss| 一级片片| 国产一区二区精品| 一级毛片看真人在线视频| 一a一级片| 九九久久国产精品大片| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产麻豆精品| 天天做日日爱夜夜爽| 成人影视在线播放| 日韩在线观看视频免费| 999精品视频在线| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产美女在线观看| 亚洲第一色在线| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 亚洲第一页乱| 国产一级生活片| 在线观看成人网| 日韩中文字幕在线亚洲一区| 亚飞与亚基在线观看| 欧美a免费| 欧美激情一区二区三区在线播放| 久久国产精品只做精品| 美国一区二区三区| 九九精品影院| 日韩欧美一及在线播放| 黄视频网站在线免费观看| 精品视频一区二区| 精品视频免费在线| 国产成人精品综合在线| 国产一区二区高清视频| 四虎影视久久久| 日本在线www| 久久精品欧美一区二区| 精品国产一区二区三区精东影业| 99热热久久| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产不卡精品一区二区三区| 国产91精品系列在线观看| 91麻豆精品国产自产在线观看一区 | 日韩字幕在线| 九九精品久久久久久久久| 91麻豆精品国产片在线观看| 久久精品成人一区二区三区| 欧美激情伊人| 国产伦理精品| 九九干| 精品在线免费播放| 亚洲女初尝黑人巨高清在线观看| 可以免费看污视频的网站| 欧美1卡一卡二卡三新区| 日韩专区第一页| 国产a视频| 国产网站免费观看| 国产高清视频免费观看| 久久国产一区二区| 二级片在线观看| 久久久久久久男人的天堂| 亚欧成人毛片一区二区三区四区| 青草国产在线观看| 99久久精品国产高清一区二区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品久久久久久中文字幕一区| 深夜做爰性大片中文| 天天色成人| 日日夜夜婷婷| 你懂的日韩| 国产成人啪精品| 国产麻豆精品高清在线播放| 国产欧美精品|