深入 Go 底層原理(四):GMP 模型深度解析

1. 引言

在上一篇文章中,我們宏觀地了解了 Go 的調度策略。現在,我們將深入到構成這個調度系統的三大核心組件:GMP。理解 GMP 模型是徹底搞懂 Go 并發調度原理的關鍵。

本文將詳細解析 G、M、P 各自的職責以及它們之間是如何協同工作的。

2. GMP 核心組件
  • G (Goroutine):

    • 定義:G 就是我們常說的 Goroutine。它是一個待執行的任務單元,包含了執行所需的棧空間指令指針 (PC) 以及其他狀態信息(如 goroutine status)。

    • 特點:G 是輕量級的,初始棧大小僅為 2KB,可以根據需要動態伸縮。Go 程序可以輕松創建成千上萬個 G。

    • 狀態:G 有多種狀態,如 _Gidle (閑置), _Grunnable (可運行), _Grunning (運行中), _Gsyscall (系統調用中), _Gwaiting (等待中), _Gdead (已死亡) 等。調度器根據這些狀態來移動 G。

  • M (Machine):

    • 定義:M 是內核線程的抽象,是真正執行代碼的實體。runtime 會限制 M 的數量,默認不超過 10000。

    • 職責:M 從一個關聯的 P 的本地隊列中獲取 G,然后執行 G 的代碼。如果 G 發生系統調用或阻塞,M 可能會與 P 解綁。

    • M0MM0是主線程,是程序啟動時創建的第一個內核線程。

  • P (Processor):

    • 定義:P 是處理器的抽象,它代表了 M 執行 Go 代碼所需的上下文資源。P 的數量在程序啟動時被設置為 GOMAXPROCS 的值,通常等于 CPU 的核心數。

    • 職責:P 是 G 和 M 之間的“中間人”。它維護一個本地可運行 G 隊列 (LRQ),為 M 提供可執行的 G。P 的存在使得調度器可以控制并發的程度(即同時有多少個 G 在真正地運行)。

    • 關鍵作用:P 的引入實現了 M 和 G 的解耦。當一個 M 因為其上運行的 G 進行系統調用而阻塞時,P 會從這個 M 上解綁,并去尋找一個空閑的 M(或創建一個新的 M)來繼續執行自己隊列中的其他 G。這使得 Go 的并發能力不會因為部分 Goroutine 的阻塞而受限。

3. GMP 的協作流程

一個典型的調度場景如下:

  1. 啟動:程序啟動,創建 M0,并創建 GOMAXPROCS 個 P。

  2. G 的創建go func() 創建一個新的 G。這個新的 G 會被優先放入當前 M 綁定的 P 的本地隊列 (LRQ) 的隊頭。

  3. M 的執行循環

    • M 啟動后,會綁定一個 P(acquirep)。

    • M 進入一個無限的調度循環 (schedule)。

    • 在循環中,M 嘗試從 P 的 LRQ、全局隊列 (GRQ) 或通過工作竊取 (runqsteal) 來獲取一個可運行的 G。

    • 找到 G 后,M 會執行 G 的代碼 (execute)。

    • G 執行完畢后,M 會再次進入調度循環尋找下一個 G。

  4. 系統調用場景 (Syscall):

    • 假設 M0 上的 G0 準備進行一個會阻塞的系統調用。

    • M0 會與它的 P0 解綁

    • P0 會去尋找一個空閑的 M(比如 M1)或者創建一個新的 M1。

    • P0 會綁定到 M1 上,并繼續執行 P0 本地隊列中的其他 G。

    • 與此同時,原來的 M0 則陷入系統調用,等待其完成。

    • 當 G0 的系統調用結束后,它會嘗試獲取一個空閑的 P 來繼續執行。如果獲取不到,G0 會被放入全局隊列。M0 則會進入休眠。

這個設計使得 P(并發的許可證)不會因為 M 的阻塞而被浪費,從而保證了 GOMAXPROCS 個 Goroutine 可以持續地、并行地運行。

4. sysmon 監控線程

除了 G, M, P,還有一個重要的后臺角色:sysmon。它是一個由 runtime 啟動的、不需要 P 的 M,在后臺執行以下任務:

  • 搶占:如上篇所述,向運行時間過長的 G 發送搶占信號。

  • 網絡輪詢 (netpoller):檢查網絡 I/O 是否就緒,并喚醒因此阻塞的 G。

  • GC 輔助:在需要時觸發 GC。

  • 釋放閑置資源:定期將長時間空閑的 M 和 P 的資源回收。

5. 總結

GMP 模型是 Go 語言高性能并發調度的核心。

  • G 是任務單元。

  • M 是執行實體(內核線程)。

  • P 是調度上下文和資源的提供者,是實現 M:N 模型的關鍵。

它們通過工作竊取、系統調用處理、異步搶占等機制緊密協作,構成了一個強大、高效、自適應的調度系統。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91729.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91729.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91729.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI賦能測試:技術變革與應用展望

AI 在測試中的應用:技術賦能與未來展望 目錄 AI 在測試中的應用:技術賦能與未來展望 1. 引言 1.1 測試在軟件開發中的重要性 1.2 AI 技術如何改變傳統測試模式 1.3 文章結構概述 2. AI 在測試中的核心應用場景 2.1 自動化測試優化 2.1.1 智能測…

Mujoco(MuJoCo,全稱Multi - Joint dynamics with Contact)一種高性能的物理引擎

Mujoco(MuJoCo,全稱Multi - Joint dynamics with Contact)是一種高性能的物理引擎,主要用于模擬多體動力學系統,廣泛應用于機器人仿真、運動學研究、人工智能等領域。以下是關于Mujoco仿真的一些詳細介紹: …

winform-窗體應用的功能介紹(部分)

1--Point實現在窗口(Form)中一個按鈕(控件)的固定位置(所在位置)一個按鈕(控件)的位置一般是固定的,另一個按鈕在窗口中位置是隨機產生的Location屬性:Location new Point(X,Y);在C#的Winform應用程序里,Button控件的鼠標懸標懸浮事件是不存在內置延遲時間的。當鼠標指針進入按…

最新Windows11系統鏡像,23H2 64位ISO鏡像

Windows 11 主要分為 Consumer Editions(消費者版)和 Business Editions(商業版)兩大類別 。消費者版主要面向家庭和個人用戶,商業版則側重于企業和商業用戶。這兩大類別中存在部分重疊的版本,比如專業版和…

linux基本系統服務——DNS服務

一、DNS域名解析原理DNS&#xff0c;Domain Name System&#xff0c;域名系統&#xff1a;在互聯網中由大量域名解析服務器共同提供的一整套關于“域名 <--> IP地址”信息查詢的數據系統!!!! C/S架構&#xff1a;DNS服務端監聽UDP 53端口&#xff08;處理客戶端查詢&…

數據處理和統計分析——08 apply自定義函數

1 apply()函數 1.1 apply()函數簡介 Pandas提供了很多數據處理的API&#xff0c;但當提供的API不能滿足需求的時候&#xff0c;需要自己編寫數據處理函數, 這個時候可以使用apply()函數&#xff1b;apply()函數可以接收一個自定義函數&#xff0c;可以將DataFrame的行或列數據傳…

C++冰箱管理實戰代碼

基于C++的冰箱管理實例 以下是一些基于C++的冰箱管理實例示例,涵蓋不同功能場景,每個示例聚焦特定實現點,代碼可直接擴展或整合到項目中。 示例1:基礎冰箱類定義 class Refrigerator { private:int capacity;std::vector<std::string> items; public:Refrigerator(…

【Python】【數據分析】Python 數據分析與可視化:全面指南

目錄1. 環境準備2. 數據處理與清洗2.1 導入數據2.2 數據清洗示例&#xff1a;處理缺失值示例&#xff1a;處理異常值2.3 數據轉換3. 數據分析3.1 描述性統計3.2 分組分析示例&#xff1a;按年齡分組計算工資的平均值3.3 時間序列分析4. 數據可視化4.1 基本繪圖示例&#xff1a;…

【AI】AIService(基本使用與指令定制)

【AI】AIService(基本使用與指令定制) 文章目錄【AI】AIService(基本使用與指令定制)1. 簡介2. AIService2.1 引入依賴2.2 編寫AIService接口2.3 測試代碼3. 指令定制3.1 系統提示詞3.2 用戶提示詞1. 簡介 AIService可以被視為應用程序服務層的一個組件&#xff0c;提供對應的…

AAAI趕稿后的心得

總結 已經第三次和老師們一起趕稿了&#xff0c;但是還是紕漏重重&#xff0c;每次都被我的垃圾寫作給嚇到。每次都手忙腳亂找不到重點&#xff0c;唉&#xff0c;我大概這輩子都成為不了郭老師&#xff1a; 自己把故事先捋清楚&#xff1a; 所有的東西都要抽象出來&#xff0c…

書籍推薦算法研究

## 項目概述本項目是一個完整的書籍推薦系統第五版(Complete Book Recommendation System V5),采用混合推薦策略,能夠處理6種不同的用戶場景,提供智能化的書籍推薦服務。## 系統架構### 核心設計思路系統采用**混合推薦策略**,結合了以下幾種推薦算法:1. **協同過濾推薦…

工具自動生成Makefile

cmake 基礎 cmake主要是生成Makefile&#xff0c;以便工程管理&#xff0c;只需要編寫CMakeLists.txt安裝camkesudo apt install cmake 安裝cmake camke --version 查看cmake版本 sudo apt upgrade cmake 升級cmake源碼隔離 在工程文件下創建一個build文件&…

Java項目:基于SSM框架實現的校園活動資訊網管理系統【ssm+B/S架構+源碼+數據庫+畢業論文+遠程部署】

摘 要 使用舊方法對校園活動資訊進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在校園活動資訊的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及時糾正等問題。 這次開發的校園活動資訊網…

關于echarts的性能優化考慮

作為資深前端工程師&#xff0c;在處理 ECharts 性能問題時&#xff0c;核心思路是減少渲染壓力、優化數據處理、避免不必要的計算&#xff0c;尤其在大數據量&#xff08;萬級以上&#xff09;、高頻交互或多圖表場景下&#xff0c;性能優化尤為關鍵。以下是實戰中驗證過的有效…

汽車EDI:Vitesco EDI 項目案例

Vitesco Technologies&#xff08;緯湃科技&#xff09;脫胎于大陸集團的動力總成部門&#xff0c;是一家于2021年上市的全球領先汽車技術供應商。公司專注于電動出行領域&#xff0c;提供電驅動系統、電池管理系統、功率電子及熱管理等關鍵技術解決方案。同時&#xff0c;其業…

譯|Netflix 技術博客:一個利用視覺-語言模型和主動學習高效構建視頻分類器的框架

本篇介紹了Netflix的視頻標注器&#xff08;VA&#xff09;&#xff0c;一個利用視覺-語言模型和主動學習的交互式框架。其技術亮點在于通過人機協作系統&#xff0c;結合零樣本能力和主動學習&#xff0c;引導領域專家高效標注視頻數據&#xff0c;顯著提升了模型樣本效率和平…

前端應用權限設計面面觀

目錄 1. 權限設計:前端為啥要操這份心? 2. 權限模型的“內功心法”:RBAC 和 ABAC RBAC:簡單粗暴的角色分配 ABAC:靈活但燒腦的屬性控制 3. 權限數據的“物流體系”:從后端到前端的旅程 權限數據從哪兒來? 權限數據咋存? 權限數據咋用? 4. 路由守衛:權限的“第…

Javaweb————Apache Tomcat服務器介紹及Windows,Linux,MAC三種系統搭建Apache Tomcat

&#x1f3cd;?&#x1f3cd;?&#x1f3cd;?第一部分&#xff1a;什么是服務器&#xff1f; 服務器是遠程的一個電腦,里面安裝服務器程序監聽對應的端口對外提供服務&#xff0c;可以根據用戶的請求去獲取對應的數據并返回給調用方。 &#x1f3cd;?&#x1f3cd;?&#…

winsock socket通訊為什么UDP服務器無法獲取客戶端IP?

針對VB6 Winsock開發中UDP服務器無法獲取客戶端IP的問題&#xff0c;以下是系統性排查方案&#xff1a; 一、基礎協議特性確認UDP無連接特性 Winsock的UDP協議本身是無連接的&#xff0c;需通過GetPeerName方法主動獲取對端IP&#xff0c;而非自動存儲。數據接收處理 必須在Dat…

大模型時代,Transformer 架構中的核心注意力機制算法詳解與優化實踐

大模型時代&#xff0c;Transformer 架構中的核心注意力機制算法詳解與優化實踐Transformer 注意力機制深度解析與工業級優化實踐一、注意力機制核心原理1.1 基礎注意力公式1.2 多頭注意力&#xff08;Multi-Head&#xff09;1.3 注意力機制可視化二、工業級優化技術2.1 計算效…