亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

淺談Go語言并發機制

2020-04-01 19:01:56
字體:
來源:轉載
供稿:網友

Go 語言相比Java等一個很大的優勢就是可以方便地編寫并發程序。Go 語言內置了 goroutine 機制,使用goroutine可以快速地開發并發程序, 更好的利用多核處理器資源。這篇文章學習goroutine 的應用及其調度實現。

一、Go語言對并發的支持

使用goroutine編程

使用 go 關鍵字用來創建 goroutine 。將go聲明放到一個需調用的函數之前,在相同地址空間調用運行這個函數,這樣該函數執行時便會作為一個獨立的并發線程。這種線程在Go語言中稱作goroutine。

goroutine的用法如下:

//go 關鍵字放在方法調用前新建一個 goroutine 并執行方法體go GetThingDone(param1, param2); //新建一個匿名方法并執行go func(param1, param2) {}(val1, val2) //直接新建一個 goroutine 并在 goroutine 中執行代碼塊go {  //do someting...} 

因為 goroutine 在多核 cpu 環境下是并行的。如果代碼塊在多個 goroutine 中執行,我們就實現了代碼并行。

如果需要了解程序的執行情況,怎么拿到并行的結果呢?需要配合使用channel進行。

使用Channel控制并發

Channels用來同步并發執行的函數并提供它們某種傳值交流的機制。

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

可以使用內置函數 make分配一個channel:

i := make(chan int)    // by default the capacity is 0s := make(chan string, 3) // non-zero capacity r := make(<-chan bool)     // can only read fromw := make(chan<- []os.FileInfo) // can only write to 

配置runtime.GOMAXPROCS

使用下面的代碼可以顯式的設置是否使用多核來執行并發任務:

runtime.GOMAXPROCS()

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

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

了解了Go語言的并發機制,接下來看一下goroutine 機制的具體實現。

二、區別并行與并發

進程、線程與處理器

在現代操作系統中,線程是處理器調度和分配的基本單位,進程則作為資源擁有的基本單位。每個進程是由私有的虛擬地址空間、代碼、數據和其它各種系統資源組成。線程是進程內部的一個執行單元。 每一個進程至少有一個主執行線程,它無需由用戶去主動創建,是由系統自動創建的。 用戶根據需要在應用程序中創建其它線程,多個線程并發地運行于同一個進程中。

并行與并發

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

在描述程序的并發或者并行時,應該說明從進程或者線程的角度出發。

  1. 并發:一個時間段內有很多的線程或進程在執行,但何時間點上都只有一個在執行,多個線程或進程爭搶時間片輪流執行
  2. 并行:一個時間段和時間點上都有多個線程或進程在執行

非并發的程序只有一個垂直的控制邏輯,在任何時刻,程序只會處在這個控制邏輯的某個位置,也就是順序執行。如果一個程序在某一時刻被多個CPU流水線同時進行處理,那么我們就說這個程序是以并行的形式在運行。

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

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

舉一個例子,編寫一個最簡單的順序結構程序輸出"Hello World",它就是非并發的,如果在程序中增加多線程,每個線程打印一個"Hello World",那么這個程序就是并發的。如果運行時只給這個程序分配單個CPU,這個并發程序還不是并行的,需要部署在多核處理器上,才能實現程序的并行。

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

用戶線程與內核級線程

線程的實現可以分為兩類:用戶級線程(User-LevelThread, ULT)和內核級線程(Kemel-LevelThread, KLT)。用戶線程由用戶代碼支持,內核線程由操作系統內核支持。

多線程模型

多線程模型即用戶級線程和內核級線程的不同連接方式。

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

將多個用戶級線程映射到一個內核級線程,線程管理在用戶空間完成。 此模式中,用戶級線程對操作系統不可見(即透明)。

Go語言并發機制,Go語言,并發機制,Golang,并發

優點: 這種模型的好處是線程上下文切換都發生在用戶空間,避免的模態切換(mode switch),從而對于性能有積極的影響。

缺點:所有的線程基于一個內核調度實體即內核線程,這意味著只有一個處理器可以被利用,在多處理器環境下這是不能夠被接受的,本質上,用戶線程只解決了并發問題,但是沒有解決并行問題。如果線程因為 I/O 操作陷入了內核態,內核態線程阻塞等待 I/O 數據,則所有的線程都將會被阻塞,用戶空間也可以使用非阻塞而 I/O,但是不能避免性能及復雜度問題。

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

將每個用戶級線程映射到一個內核級線程。

Go語言并發機制,Go語言,并發機制,Golang,并發

每個線程由內核調度器獨立的調度,所以如果一個線程阻塞則不影響其他的線程。

優點:在多核處理器的硬件的支持下,內核空間線程模型支持了真正的并行,當一個線程被阻塞后,允許另一個線程繼續執行,所以并發能力較強。

缺點:每創建一個用戶級線程都需要創建一個內核級線程與其對應,這樣創建線程的開銷比較大,會影響到應用程序的性能。

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

內核線程和用戶線程的數量比為 M : N,內核用戶空間綜合了前兩種的優點。

Go語言并發機制,Go語言,并發機制,Golang,并發

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

四、goroutine機制的調度實現

goroutine機制實現了M : N的線程模型,goroutine機制是協程(coroutine)的一種實現,golang內置的調度器,可以讓多核CPU中每個CPU執行一個協程。

理解goroutine機制的原理,關鍵是理解Go語言scheduler的實現。

調度器是如何工作的

Go語言中支撐整個scheduler實現的主要有4個重要結構,分別是M、G、P、Sched, 前三個定義在runtime.h中,Sched定義在proc.c中。

  1. Sched結構就是調度器,它維護有存儲M和G的隊列以及調度器的一些狀態信息等。
  2. M結構是Machine,系統線程,它由操作系統管理的,goroutine就是跑在M之上的;M是一個很大的結構,里面維護小對象內存cache(mcache)、當前執行的goroutine、隨機數發生器等等非常多的信息。
  3. P結構是Processor,處理器,它的主要用途就是用來執行goroutine的,它維護了一個goroutine隊列,即runqueue。Processor是讓我們從N:1調度到M:N調度的重要部分。
  4. G是goroutine實現的核心結構,它包含了棧,指令指針,以及其他對調度goroutine很重要的信息,例如其阻塞的channel。

Processor的數量是在啟動時被設置為環境變量GOMAXPROCS的值,或者通過運行時調用函數GOMAXPROCS()進行設置。Processor數量固定意味著任意時刻只有GOMAXPROCS個線程在運行go代碼。

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

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

Go語言并發機制,Go語言,并發機制,Golang,并發

在單核處理器的場景下,所有goroutine運行在同一個M系統線程中,每一個M系統線程維護一個Processor,任何時刻,一個Processor中只有一個goroutine,其他goroutine在runqueue中等待。一個goroutine運行完自己的時間片后,讓出上下文,回到runqueue中。 多核處理器的場景下,為了運行goroutines,每個M系統線程會持有一個Processor。

Go語言并發機制,Go語言,并發機制,Golang,并發

在正常情況下,scheduler會按照上面的流程進行調度,但是線程會發生阻塞等情況,看一下goroutine對線程阻塞等的處理。

線程阻塞

當正在運行的goroutine阻塞的時候,例如進行系統調用,會再創建一個系統線程(M1),當前的M線程放棄了它的Processor,P轉到新的線程中去運行。

Go語言并發機制,Go語言,并發機制,Golang,并發

runqueue執行完成

當其中一個Processor的runqueue為空,沒有goroutine可以調度。它會從另外一個上下文偷取一半的goroutine。

Go語言并發機制,Go語言,并發機制,Golang,并發

五、對并發實現的進一步思考

Go語言的并發機制還有很多值得探討的,比如Go語言和Scala并發實現的不同,Golang CSP 和Actor模型的對比等。

了解并發機制的這些實現,可以幫助我們更好的進行并發程序的開發,實現性能的最優化。

關于三種多線程模型,可以關注一下Java語言的實現。

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕不卡在线视频极品| 亚洲高清色综合| 欧美性高潮床叫视频| 日韩电影免费在线观看中文字幕| 黄色91在线观看| 夜色77av精品影院| 久久亚洲精品中文字幕冲田杏梨| 国产日产欧美精品| 亚洲综合日韩在线| 欧美精品日韩三级| 欧美日韩一区二区三区在线免费观看| 91视频免费在线| 国产一区二区三区在线播放免费观看| 色偷偷av亚洲男人的天堂| 亚洲风情亚aⅴ在线发布| 国产精品精品久久久久久| 精品国产自在精品国产浪潮| 久久国产精品久久久久| 亚洲人成在线观看| 久久视频免费观看| 欧美精品一区二区三区国产精品| 亚洲第一页在线| 国产亚洲在线播放| 日韩成人xxxx| 岛国av一区二区| 97精品一区二区视频在线观看| 日韩精品极品视频| 中文字幕亚洲在线| 久久精品国产清自在天天线| 日韩欧美亚洲综合| 日本亚洲欧美成人| 欧美精品久久久久久久免费观看| 草民午夜欧美限制a级福利片| 亚洲欧洲高清在线| www日韩中文字幕在线看| 久久久久北条麻妃免费看| 高跟丝袜欧美一区| 激情成人在线视频| 欧美最顶级丰满的aⅴ艳星| 欧美日韩一区二区免费视频| wwwwwwww亚洲| 丰满岳妇乱一区二区三区| 国产婷婷成人久久av免费高清| 日韩**中文字幕毛片| 7m精品福利视频导航| 国产精品免费久久久久久| 亚洲精品日韩久久久| 最好看的2019的中文字幕视频| 美女扒开尿口让男人操亚洲视频网站| 欧美制服第一页| 久久久久久久久电影| 91国产视频在线播放| 久久久电影免费观看完整版| 亚洲免费中文字幕| 成人亲热视频网站| 国产亚洲激情视频在线| 日韩电影网在线| 亚洲国产黄色片| 日韩电影大片中文字幕| 欧美另类暴力丝袜| 中文字幕久久久av一区| 最新国产成人av网站网址麻豆| 欧美一级大片在线观看| 日韩**中文字幕毛片| 国产精品av网站| 久久久爽爽爽美女图片| 97久久精品人人澡人人爽缅北| 91最新国产视频| 国产精品91在线| 中文字幕日韩在线视频| 亚洲成色www8888| 精品亚洲国产视频| 久久久久国产精品一区| 日韩日本欧美亚洲| 欧美成人免费小视频| 清纯唯美亚洲激情| 日韩精品中文在线观看| 亚洲免费一在线| 久久久久五月天| 日韩毛片在线观看| 国产精品啪视频| 欧美成人中文字幕| 国产成人精品综合| 日韩av在线一区| 成人福利在线观看| 国产成人精品视频在线| 青青草精品毛片| 欧美一级淫片videoshd| 亚洲欧美日韩图片| 色综合久久久888| 亚洲网站视频福利| 久久精品视频va| 国产婷婷成人久久av免费高清| 国产精品自拍网| 亚洲欧美精品中文字幕在线| 成人激情视频小说免费下载| 精品偷拍各种wc美女嘘嘘| 国产精品久久久久久久app| 国产精品亚洲第一区| 国产精品视频公开费视频| 中文字幕日韩综合av| 欧美日韩国产精品一区二区不卡中文| 欧美日韩国产区| 狠狠久久亚洲欧美专区| 色一情一乱一区二区| 久久精品国产精品亚洲| 中文字幕亚洲二区| 亚洲精品日韩av| 中文字幕免费精品一区高清| 国产精品www网站| 色偷偷9999www| 亚洲黄在线观看| 国产国语刺激对白av不卡| 亚洲黄色av女优在线观看| 91高潮精品免费porn| 久久精品视频在线播放| 欧美午夜女人视频在线| 成人欧美在线视频| 久久久久国产精品免费网站| 九九热精品视频在线播放| 亚洲午夜久久久久久久| 日本精品一区二区三区在线| 国产精品中文字幕在线观看| 国产精品一区二区久久久| 久久久精品999| 国产精品国产三级国产aⅴ9色| 亚洲欧美成人在线| 国产精品永久在线| 精品无人国产偷自产在线| 韩国国内大量揄拍精品视频| 国内精品久久久久伊人av| 国产在线视频一区| 国语自产精品视频在线看| 国产精品999| 麻豆一区二区在线观看| 国产日韩欧美91| 亚洲国产一区二区三区四区| 亚洲国产欧美日韩精品| 成人激情电影一区二区| 中文字幕精品一区二区精品| 岛国视频午夜一区免费在线观看| 亚洲欧美一区二区精品久久久| 高清一区二区三区四区五区| 成人观看高清在线观看免费| 亚洲国产成人爱av在线播放| 欧美成人中文字幕在线| 国产精品一区二区三区久久| 久久精品一偷一偷国产| 亚洲韩国日本中文字幕| 欧美专区国产专区| 国产精品r级在线| 精品国产一区二区三区在线观看| 国产精品一区二区久久久| 久久久精品亚洲| 亚洲激情视频在线观看| 国产精品久久电影观看| 亚洲国产欧美自拍| 国产精品678| 国产精品v片在线观看不卡| 亚洲欧美中文日韩在线v日本| 日韩中文理论片| 亚洲精品欧美日韩专区| 亚洲国产天堂久久综合网| 欧亚精品中文字幕|