日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

揭秘系列:Goroutine調度器

來源: 責編: 時間:2023-11-21 09:39:03 278觀看
導讀現在不要擔心理解上面的圖片,因為我們將從非常基礎的知識開始。Goroutines分布在線程中,由Goroutine調度器在幕后處理。根據我們之前的討論,我們知道一些關于Goroutines的事情:從原始執行速度來看,Goroutines不一定比線程

vYI28資訊網——每日最新資訊28at.com

現在不要擔心理解上面的圖片,因為我們將從非常基礎的知識開始。vYI28資訊網——每日最新資訊28at.com

Goroutines分布在線程中,由Goroutine調度器在幕后處理。根據我們之前的討論,我們知道一些關于Goroutines的事情:vYI28資訊網——每日最新資訊28at.com

  • 從原始執行速度來看,Goroutines不一定比線程更快,因為它們需要一個實際的線程來運行。
  • Goroutines的真正優勢在于上下文切換、內存占用、創建和拆除的成本等方面。

你可能之前聽說過Goroutine調度器,但我們真正了解它是如何工作的嗎?它是如何將Goroutines與線程配對的?vYI28資訊網——每日最新資訊28at.com

現在讓我們一步一步地分解調度器的操作。vYI28資訊網——每日最新資訊28at.com

一、Goroutine的M:N調度器

Go團隊為我們真正簡化了并發處理,想想看:創建一個Goroutine就像在函數前面加上 go 關鍵字一樣容易。vYI28資訊網——每日最新資訊28at.com

go doWork()

但在這個簡單的步驟背后,有一個更深層的系統在運作。vYI28資訊網——每日最新資訊28at.com

從一開始,Go并不是簡單地提供了線程。相反,在中間有一個輔助工具,Goroutine調度器,它是Go運行時的關鍵部分。vYI28資訊網——每日最新資訊28at.com

vYI28資訊網——每日最新資訊28at.com

1*6UyqGhkbOV7kSlRe1CD-gA.pngvYI28資訊網——每日最新資訊28at.com

那么什么是M:N標簽?vYI28資訊網——每日最新資訊28at.com

它表示Go調度器在將M個Goroutines映射到N個內核線程時所起的作用,形成了M:N模型。你可以擁有更多的操作系統線程,就像可以擁有更多的Goroutines一樣。vYI28資訊網——每日最新資訊28at.com

在我們深入研究調度器之前,讓我們澄清一下經常混淆的兩個術語:并發和并行。vYI28資訊網——每日最新資訊28at.com

  • 并發:這是關于同時處理多個任務,它們都在運動,但不總是在同一時刻。
  • 并行:這意味著許多任務在完全相同的時間運行,通常使用多個CPU核心。

vYI28資訊網——每日最新資訊28at.com

1*30ViMAPkVySvdSDc-hI3sA.pngvYI28資訊網——每日最新資訊28at.com

讓我們看看Go調度器是如何與線程配合運作的。vYI28資訊網——每日最新資訊28at.com

二、PMG 模型

在我們深入研究內部工作原理之前,讓我們分解一下P、M和G代表什么。vYI28資訊網——每日最新資訊28at.com

1.G(Goroutine)

Goroutine充當Go的最小執行單元,類似于輕量級線程。vYI28資訊網——每日最新資訊28at.com

在Go的運行時中,它由一個名為g的struct{}表示。一旦創建,它會找到一個邏輯處理器P的本地可運行隊列(或G隊列)中的位置,然后P將其交給一個實際的內核線程M。vYI28資訊網——每日最新資訊28at.com

Goroutines通常存在三種主要狀態:vYI28資訊網——每日最新資訊28at.com

  • 等待:在這個階段,Goroutine停滯不前,可能因為通道或鎖之類的操作而暫停,或者可能被系統調用暫停。
  • 可運行:Goroutine已經準備好運行,但尚未開始運行,它正在等待輪到它在一個線程(M)上運行。
  • 運行:現在,Goroutine正在一個線程(M)上積極執行。它會一直執行,直到任務完成,除非調度器中斷它或其他原因阻止了它的執行。

vYI28資訊網——每日最新資訊28at.com

1*U62eyES6_koQtsv_9jWKHw.pngvYI28資訊網——每日最新資訊28at.com

Goroutines并不僅僅被使用一次然后被丟棄。vYI28資訊網——每日最新資訊28at.com

相反,當啟動新的Goroutine時,Go的運行時會從Goroutine池vYI28資訊網——每日最新資訊28at.com

中選擇一個,但如果找不到任何可用的Goroutine,它會創建一個新的。然后,這個新的Goroutine加入到一個P的可運行隊列中。vYI28資訊網——每日最新資訊28at.com

2.P(邏輯處理器)

在Go調度器中,當我們提到“處理器”時,我們指的是邏輯實體,而不是物理實體。vYI28資訊網——每日最新資訊28at.com

默認情況下,P的數量設置為可用的核心數,你可以使用runtime.GOMAXPROCS(int)函數來檢查或更改這些處理器的數量。vYI28資訊網——每日最新資訊28at.com

runtime.GOMAXPROCS(0) // 獲取當前允許的邏輯處理器數量

如果你想更改這個數量,最好是在應用程序啟動時更改它,如果在運行時更改,它會導致STW(停止一切),直到重新調整處理器。vYI28資訊網——每日最新資訊28at.com

每個P都擁有自己的可運行Goroutines列表,稱為本地運行隊列,最多可以容納256個Goroutines。vYI28資訊網——每日最新資訊28at.com

vYI28資訊網——每日最新資訊28at.com

1*0EneA397HA1uYYeg0_HspQ.pngvYI28資訊網——每日最新資訊28at.com

調度器 — P(邏輯處理器)vYI28資訊網——每日最新資訊28at.com

如果P的隊列達到了最大Coroutines數(256),那么就有一個共享隊列,稱為全局運行隊列,但我們將稍后討論這個。vYI28資訊網——每日最新資訊28at.com

"那么 'P' 的這個數量到底代表什么?" 它表示可以同時運行的Goroutines數量 — 想象它們并行運行。vYI28資訊網——每日最新資訊28at.com

vYI28資訊網——每日最新資訊28at.com

3.M(機器線程 — 操作系統線程)

一個典型的Go程序最多可以使用1萬個線程。vYI28資訊網——每日最新資訊28at.com

是的,我說的是線程,而不是Goroutines。如果超出這個限制,你可能會使你的Go應用程序崩潰。vYI28資訊網——每日最新資訊28at.com

"什么情況下會創建一個線程?" 想象一種情況:一個Goroutine處于可運行狀態并需要一個線程。如果所有線程已經被阻塞,可能是因為系統調用或非搶占操作,會怎么樣?在這種情況下,調度器會介入并為該Goroutine創建一個新線程。一個需要注意的事情是,如果一個線程只是忙于昂貴的計算或長時間運行的任務,它不被視為被卡住或被阻塞。如果你想更改默認線程限制,你可以使用 runtime/debug.SetMaxThreads() 函數,它允許你設置你的Go程序可以使用的操作系統線程的最大數量。此外,值得知道的是,線程是可以重復使用的,因為創建或銷毀線程是消耗資源的。vYI28資訊網——每日最新資訊28at.com

vYI28資訊網——每日最新資訊28at.com

三、MPG 工作原理

讓我們通過項目符號逐步了解 M、P 和 G 如何一起運作。vYI28資訊網——每日最新資訊28at.com

我不會在這里深入討論每個細節,但我將在即將發布的故事中深入探討。如果你感興趣,請訂閱。vYI28資訊網——每日最新資訊28at.com

vYI28資訊網——每日最新資訊28at.com

1*d4hu416FJtHHaJaKJFYkGg.pngvYI28資訊網——每日最新資訊28at.com

1.Go Scheduler 的工作原理:

  • 初始化 goroutine:通過使用 go func() 命令,Go Runtime 要么創建一個新的 goroutine,要么從池中選擇一個現有的。
  • 排隊位置:goroutine 尋找其在隊列中的位置,如果所有邏輯處理器(P)的本地隊列都滿了,那么這個 goroutine 就被放入全局隊列。
  • 線程配對:這是 M 開始發揮作用的地方。它獲取一個 P 并開始處理來自 P 本地隊列的 goroutine,當 M 與這個 goroutine 交互時,與之關聯的 P 就變得占用,不再可用于其他 M。
  • 竊取行為:如果某個 P 的隊列被耗盡,M 會嘗試“借用”另一個 P 隊列中一半可運行的 goroutine。如果不成功,它然后檢查全局隊列,然后再檢查網絡輪詢器(請查看下面的“竊取過程”圖表部分)。
  • 資源分配:M 選擇了一個 goroutine(G)之后,它會獲取運行 G 所需的所有資源。“那么被阻塞的線程呢?” 如果一個 goroutine 啟動了需要時間的系統調用(比如讀取文件),那么 M 會等待。但調度程序不喜歡某個只是坐在那里等待的線程,它會將被暫停的 M 與其 P 解除連接,并將來自隊列的另一個可運行的 goroutine 與新的或現有的 M 連接起來,然后與 P 協作。

2.被阻塞的線程

竊取過程:vYI28資訊網——每日最新資訊28at.com

當一個線程(M)完成了它的任務并沒有其他事情可做時,它不會坐在那里。vYI28資訊網——每日最新資訊28at.com

相反,它積極地尋找更多工作,觀察其他處理器并獲取它們一半的任務,讓我們來詳細了解一下:vYI28資訊網——每日最新資訊28at.com

vYI28資訊網——每日最新資訊28at.com

ewA.pngvYI28資訊網——每日最新資訊28at.com

  • 每 61 個時鐘滴答,M 檢查全局可運行隊列,以確保執行的公平性。如果在全局隊列中找到一個可運行的 goroutine,就停止。
  • 然后,線程 M 檢查其本地運行隊列,與其處理器 P 相關聯,以查看是否有可運行的 goroutine 可以處理。
  • 如果線程發現它的隊列是空的,那么它會查看全局隊列,看看那里是否有等待處理的任務。
  • 然后,線程會檢查網絡輪詢器,以查看是否有與網絡相關的任務。
  • 如果線程在檢查了網絡輪詢器后仍然沒有找到任務,它將進入主動搜索模式,我們可以將其視為旋轉狀態。
  • 在這種狀態下,線程試圖從其他處理器的隊列中“借用”任務。
  • 經過所有這些步驟后,如果線程仍然找不到工作,它將停止主動搜索。
  • 現在,如果有新的任務進來,而且有一個沒有在搜索狀態的空閑處理器,那么可以提示另一個線程開始工作。

需要注意的細節是全局隊列實際上被檢查了兩次:每 61 個時鐘滴答一次以確保公平性,如果本地隊列為空,就再次檢查。vYI28資訊網——每日最新資訊28at.com

“如果 M 與其 P 相關聯,它怎么能從其他處理器那里獲取任務呢?M 會更改其 P 嗎?” 答案是不會。即使 M 從另一個 P 的隊列中獲取任務,它仍然使用其原始處理器來運行該任務。因此,在 M 承擔新任務的同時,它仍然忠實于其處理器。vYI28資訊網——每日最新資訊28at.com

vYI28資訊網——每日最新資訊28at.com

“為什么是 61?” 在設計算法時,特別是哈希算法,通常會選擇質數,因為它們除了 1 和它們自己之外沒有除數。這可以降低出現模式或規律的機會,從而防止“碰撞”或其他不希望出現的行為。如果太短,系統可能會浪費資源頻繁檢查全局運行隊列。如果太長,goroutine 可能會在執行之前等待過長的時間。vYI28資訊網——每日最新資訊28at.com

3.網絡輪詢器

我們還沒有詳細討論網絡輪詢器,但它在竊取過程圖表中提到了。vYI28資訊網——每日最新資訊28at.com

與 Go Scheduler 一樣,網絡輪詢器是 Go Runtime 的組成部分,負責處理與網絡相關的調用(例如,網絡 I/O)。vYI28資訊網——每日最新資訊28at.com

讓我們比較兩種系統調用類型:vYI28資訊網——每日最新資訊28at.com

  • 與網絡相關的系統調用:當一個 goroutine 執行網絡 I/O 操作時,它不會阻塞線程,而是會在網絡輪詢器中注冊。輪詢器會異步等待操作完成,一旦完成,goroutine 就會再次可運行,可以在一個線程上繼續執行。
  • 其他系統調用:如果它們可能會阻塞并且不由網絡輪詢器處理,它們可能會導致 goroutine 將其執行卸載到操作系統線程上。只有特定的操作系統線程會被阻塞,Go 運行時調度程序可以在不同線程上執行其他 goroutine。

本文鏈接:http://www.www897cc.com/showinfo-26-32011-0.html揭秘系列:Goroutine調度器

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 函數組件和函數式編程有關系么?

下一篇: 在Golang中掌握并發和Goroutines

標簽:
  • 熱門焦點
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據今天鴻蒙OS 4.0的現場演示顯示,華為的實況窗可以更高效的展現出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 分布式系統中的CAP理論,面試必問,你理解了嘛?

    對于剛剛接觸分布式系統的小伙伴們來說,一提起分布式系統,就感覺高大上,深不可測。而且看了很多書和視頻還是一臉懵逼。這篇文章主要使用大白話的方式,帶你理解一下分布式系統
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • 網紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業評論6月26日高調宣布入市,網絡名嘴大v胡錫進居然進軍了股市。在一次財經媒體峰會上,幾個財經圈媒體大佬就“胡錫進炒股是否知道認真報道”展開討論。有
  • 東方甄選單飛:有些鳥注定是關不住的

    作者:彭寬鴻來源:華爾街科技眼‍‍‍‍‍‍‍‍‍‍東方甄選創始人俞敏洪帶隊的“7天甘肅行”直播活動已在近日順利收官。成立后一
  • 到手價3099元起!iQOO Neo8 Pro今日首銷:安卓性能最強旗艦

    5月23日,iQOO如期舉行了新品發布會,全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更
  • OPPO K11搭載長壽版100W超級閃充:26分鐘充滿100%

    據此前官方宣布,OPPO將于7月25日也就是今天下午14:30舉辦新品發布會,屆時全新的OPPO K11將正式與大家見面,將主打旗艦影像,和同檔位競品相比,其最大的賣
  • 由于成本持續增加,筆記本產品價格預計將明顯上漲

    根據知情人士透露,由于材料、物流等成本持續增加,筆記本產品價格預計將在2021年下半年有明顯上漲。進入6月下旬以來,全球半導體芯片缺貨情況加劇,顯卡、處理器
Top 主站蜘蛛池模板: 铅山县| 黑龙江省| 桐城市| 长治市| 铅山县| 惠来县| 乌拉特前旗| 雅江县| 崇义县| 林周县| 睢宁县| 舟曲县| 兴城市| 屏南县| 靖西县| 察雅县| 洪洞县| 金溪县| 南丰县| 古田县| 汪清县| 长治市| 麦盖提县| 中宁县| 宝清县| 沙河市| 米泉市| 米林县| 荣昌县| 甘南县| 灵武市| 若尔盖县| 驻马店市| 义乌市| 彭水| 茶陵县| 乌鲁木齐县| 万荣县| 仁怀市| 文化| 泰来县|