首頁 >後端開發 >Golang >在有阻塞操作的情況下,Go 調度程序如何管理 M 和 P 的建立?

在有阻塞操作的情況下,Go 調度程序如何管理 M 和 P 的建立?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-31 05:20:02574瀏覽

How does the Go scheduler manage the creation of M and P in the presence of blocking operations?

理解Go Scheduler 中的M 和P 建立

Go 調度器在涉及goroutine、OS 執行緒(M) 和上下文的模型上運轉/處理器(P)。為了優化效能,調度程序動態管理 M 和 P 的建立和使用。

M 的建立

當排程器偵測到需要執行阻塞時建立 M任務。在範例程式碼中,goroutines 執行阻塞資料庫操作,這將觸發建立額外的 M。創建的 M 的確切數量取決於阻塞 goroutine 的數量和可用的系統資源。

建立P

P 是在新的 goroutine 啟動時建立的。然而,調度器不會為每個 goroutine 創建一個新的 P。相反,它會重複使用現有的 P 實例,維持固定數量的 P 等於 GOMAXPROCS 的值,通常設定為可用 CPU 的數量。

在您的範例程式碼中

在您的測試程式碼中,您分兩批創建了 50 個 goroutine。由於資料庫操作是阻塞的,因此將根據需要建立 M 來處理阻塞 goroutine。但是,由於 P 實例被重複使用,因此只會建立 8 個 P,代表系統上虛擬核心的數量。

更多資源

欲進一步探索此問題主題,請參考以下資源:

  • [Gooutine、作業系統執行緒和CPU 管理](https://www.programming-books.net/2019/07/understand-go-scheduler- goroutine.html)
  • 【理解Go GMP (Goroutine-M-P) 模型】(https: //blog.container-solutions.com/understand-go-gmp-goroutine-m-p-model)

以上是在有阻塞操作的情況下,Go 調度程序如何管理 M 和 P 的建立?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn