中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang?CSP并發機制及使用模型是什么

發布時間:2022-05-26 09:09:18 來源:億速云 閱讀:152 作者:zzz 欄目:開發技術

這篇文章主要介紹了Golang CSP并發機制及使用模型是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Golang CSP并發機制及使用模型是什么文章都會有所收獲,下面我們一起來看看吧。

CSP并發模型

CSP模型是上個世紀七十年代提出的,用于描述兩個獨立的并發實體通過共享的通訊 channel(管道)進行通信的并發模型。 CSP中channel是第一類對象,它不關注發送消息的實體,而關注與發送消息時使用的channel。

Golang CSP

Golang 就是借用CSP模型的一些概念為之實現并發進行理論支持,其實從實際上出發,go語言并沒有,完全實現了CSP模型的所有理論,僅僅是借用了 process和channel這兩個概念。process是在go語言上的表現就是 goroutine 是實際并發執行的實體,每個實體之間是通過channel通訊來實現數據共享。

Channel

Golang中使用 CSP中 channel 這個概念。channel 是被單獨創建并且可以在進程之間傳遞,它的通信模式類似于 boss-worker 模式的,一個實體通過將消息發送到channel 中,然后又監聽這個 channel 的實體處理,兩個實體之間是匿名的,這個就實現實體中間的解耦,其中 channel 是同步的一個消息被發送到 channel 中,最終是一定要被另外的實體消費掉的,在實現原理上其實是一個阻塞的消息隊列。

Goroutine

Goroutine 是實際并發執行的實體,它底層是使用協程(coroutine)實現并發,coroutine是一種運行在用戶態的用戶線程,類似于 greenthread,go底層選擇使用coroutine的出發點是因為,它具有以下特點:

  • 用戶空間 避免了內核態和用戶態的切換導致的成本

  • 可以由語言和框架層進行調度

  • 更小的棧空間允許創建大量的實例

可以看到第二條 用戶空間線程的調度不是由操作系統來完成的,像在java 1.3中使用的greenthread的是由JVM統一調度的(后java已經改為內核線程),還有在ruby中的fiber(半協程) 是需要在重新中自己進行調度的,而goroutine是在golang層面提供了調度器,并且對網絡IO庫進行了封裝,屏蔽了復雜的細節,對外提供統一的語法關鍵字支持,簡化了并發程序編寫的成本。

Goroutine 調度器

上節已經說了,golang使用goroutine做為最小的執行單位,但是這個執行單位還是在用戶空間,實際上最后被處理器執行的還是內核中的線程,用戶線程和內核線程的調度方法有:

N:1 多個用戶線程對應一個內核線程

Golang?CSP并發機制及使用模型是什么

1:1 一個用戶線程對應一個內核線程

Golang?CSP并發機制及使用模型是什么

M:N 用戶線程和內核線程是多對多的對應關系

Golang?CSP并發機制及使用模型是什么

golang 通過為goroutine提供語言層面的調度器,來實現了高效率的M:N線程對應關系

Golang?CSP并發機制及使用模型是什么

調度示意

圖中

  • M:是內核線程

  • P : 是調度協調,用于協調M和G的執行,內核線程只有拿到了 P才能對goroutine繼續調度執行,一般都是通過限定P的個數來控制golang的并發度

  • G : 是待執行的goroutine,包含這個goroutine的棧空間

  • Gn : 灰色背景的Gn 是已經掛起的goroutine,它們被添加到了執行隊列中,然后需要等待網絡IO的goroutine,當P通過 epoll查詢到特定的fd的時候,會重新調度起對應的,正在掛起的goroutine。

Golang為了調度的公平性,在調度器加入了steal working 算法 ,在一個P自己的執行隊列,處理完之后,它會先到全局的執行隊列中偷G進行處理,如果沒有的話,再會到其他P的執行隊列中搶G來進行處理。

關于“Golang CSP并發機制及使用模型是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Golang CSP并發機制及使用模型是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永平县| 文昌市| 梁平县| 金坛市| 新乡市| 虹口区| 黄陵县| 名山县| 孙吴县| 老河口市| 石楼县| 犍为县| 鹤岗市| 怀集县| 甘谷县| 尼勒克县| 勃利县| 姜堰市| 同江市| 濮阳市| 临沂市| 信阳市| 福清市| 金坛市| 通渭县| 广州市| 高唐县| 清水河县| 金平| 耒阳市| 温宿县| 麻城市| 洛浦县| 徐州市| 卢氏县| 环江| 泉州市| 嵩明县| 锦州市| 永安市| 新郑市|