GMP模型入門

go的并發實現采用的是M:N的線程模型,落地就是gmp模型。

M:N模型如下圖:

gmp模型如下圖:

---

Go 的 GMP 模型是其 高效并發調度機制的核心。GMP 代表:

  • G:Goroutine(用戶態線程)

  • M:Machine(綁定內核線程)

  • P:Processor(調度器/執行上下文)

Go 通過這三個組件,實現了 goroutine 的調度和執行,避免了頻繁的線程創建與上下文切換,性能優秀。

那么gmp模型是怎么實現的呢?

多個 Goroutine (G) -> 由 P 管理調度 -> 由 M(線程)實際執行;

具體來,需要執行的G是放在P的隊列里面等著被執行調用的,不過有時候會有一些岔子,為了保證M的使用率,會有一些具體的調度算法,讓G被調來調取,大概情況是:

  1. Hand off:比較重的調度;M阻塞了(syscall),就把M手頭的G收走,讓其他M去執行;

  2. Work Stealing:M對于的P中的隊列沒有G了,從其他地方調一些來

  3. 普通調度:G1阻塞了,例如sleep,io了,直接把G1掛起,讓其他G被M執行。

  4. 等等

head off可以用圖片來理解:

Hand off圖源


整體的調度思路可以用偽代碼來理解:

?// G = Goroutine,代表一個用戶級線程(任務)// M = Machine,代表一個工作線程(對應一個內核線程)// P = Processor,代表執行資源(運行隊列+執行上下文),M 必須綁定 P 才能運行 G?type G struct {fn func() ? ?// Goroutine 要執行的函數}?type M struct {p *P ? ? ? ? // 當前綁定的 Pcurg *G ? ? ?// 當前正在執行的 G// ... 還有調用棧等}?type P struct {runQueue []*G ? ?// 本地 G 隊列// 還包括調度器上下文、調度時間等}?// 系統初始化時,創建 GOMAXPROCS 個 P,通常等于 CPU 核數func initRuntime() {for i := 0; i < GOMAXPROCS; i++ {allP[i] = new(P)}// 啟動第一個 MstartM()}?// 啟動一個 M(內核線程),從全局找可用的 P,然后調度func startM() {m := new(M)m.p = acquireP() ? // 找一個空閑 Pgo m.run() ? ? ? ? // 啟動內核線程,進入調度循環}?// M 的主循環,持續運行 Gfunc (m *M) run() {for {g := m.p.findRunnableG() // 找到一個可運行的 Gif g == nil {// 若本地隊列空了,可以嘗試 steal 其他 P 的 Gg = stealFromOtherP()if g == nil {// 若仍找不到,當前 M 休眠stopM(m)return}}m.curg = grunG(g) // 運行 G 的函數m.curg = nil}}?// P 的調度器,從本地 runQueue 中找 goroutinefunc (p *P) findRunnableG() *G {if len(p.runQueue) == 0 {return nil}g := p.runQueue[0]p.runQueue = p.runQueue[1:]return g}?// 當調用 go f() 時,生成一個新的 G,并放入當前 P 的隊列func goNew(f func()) {g := &G{fn: f}curP := currentM().pcurP.runQueue = append(curP.runQueue, g)// 若當前 M 忙不過來,可觸發 newM 讓新線程幫忙跑 G}
?

參考資料:

深入淺出 Go 語言 GMP 模型?https://juejin.cn/post/7434518199234740233

劉丹冰?【Golang深入理解GPM模型】https://www.bilibili.com/video/BV19r4y1w7Nx/?share_source=copy_web&vd_source=4ab2dac702abaae48d1782021ca7150c

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

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

相關文章

達夢數據庫-報錯-01-[-3205]:全文索引詞庫加載出錯

目錄 一、環境信息 二、說點什么 三、模擬實驗 1、前臺啟動數據庫 2、重建全文索引報錯 3、日志信息 4、查找SYSWORD.UTF8.LIB 5、想一想加做一做 6、重啟數據庫 7、重建全文索引 8、總結 一、環境信息 名稱值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系統CentO…

經典密碼學和現代密碼學的結構及其主要區別(1)維吉尼亞密碼—附py代碼

Vigenre cipher 維吉尼亞密碼 維吉尼亞密碼由布萊斯德維吉尼亞在 16 世紀發明&#xff0c;是凱撒密碼的一個更復雜的擴展。它是一種多字母替換密碼&#xff0c;使用一個關鍵字來確定明文中不同字母的多個移位值。 與凱撒密碼不同&#xff0c;凱撒密碼對所有字母都有固定的偏移…

Ubuntu部署私有Gitlab

這個東西安裝其實挺簡單的&#xff0c;但是因為我這邊遷移了數據目錄和使用自己安裝的 nginx 代理還是踩了幾個坑&#xff0c;所以大家可以注意下 先看下安裝 # 先安裝必要組件 sudo apt update sudo apt install -y curl openssh-server ca-certificates tzdata perl# 添加gi…

【JVM 02-JVM內存結構之-程序計數器】

程序計數器 筆記記錄 1. 定義2. 作用3. 特點4. 拓展理解4.1 PC寄存器存儲字節碼指令地址有什么用&#xff1f;4.2 PC寄存器為什么被設定為線程私有的&#xff1f;4.3 為什么執行native方法時&#xff0c;是undefined&#xff1f; 學習資料來源-b站黑馬JVM& 尚硅谷JVM精講與…

【node.js】數據庫與存儲

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;node.js 文章目錄 1. 數據庫概述1.1 數據庫在Node.js中的作用1.2 Node.js支持的數據庫類型 2. 關系型數據庫集成2.1 MySQL與Node.js2.1.1 安裝MySQL驅動2.1.2 建立連接2.1.3 執行CRUD操作 2.2 PostgreSQL與Node.js2.2.1 安裝pg驅…

Windows10和Ubuntu24.04安裝Dify

1、win10上安裝docker不順利 參考&#xff1a;Dify的安裝_dify安裝-CSDN博客等資料&#xff0c;Dify依賴Docker運行&#xff0c;在Win10上安裝Docker&#xff0c;先安裝wsl。在PowerShell(管理員)中輸入&#xff1a; wsl --install 或顯示“找不到指定文件”&#xff0c;或顯示…

電網絕緣子及破損、閃絡缺陷YOLO數據集

概述 電網絕緣子及破損、閃絡缺陷YOLO數據集??&#xff0c;專為輸電線路缺陷檢測任務設計&#xff0c;可幫助開發者快速構建智能化識別模型。 主要內容 ??數據集規模?? 訓練集&#xff1a;2004張標注圖像驗證集&#xff1a;907張標注圖像所有數據均經過嚴格篩選與標注&…

5.2.4 wpf中MultiBinding的使用方法

在 WPF 中,MultiBinding 允許將多個綁定(Binding)組合成一個邏輯結果,并通過一個轉換器(IMultiValueConverter)處理這些值,最終影響目標屬性。以下是其核心用法和示例: 核心組件: MultiBinding:定義多個綁定源的集合。 IMultiValueConverter:實現邏…

基于SpringBoot+Vue的足球青訓俱樂部管理后臺系統的設計與開發

項目背景與概述 隨著足球青訓行業的快速發展&#xff0c;如何高效、規范地管理學員、教練以及課程等日常工作&#xff0c;成為了青訓俱樂部運營的重要課題。為了提升俱樂部的管理效率與用戶體驗&#xff0c;基于 Spring Boot 和 Vue.js 開發了一個 足球青訓俱樂部管理后臺系統…

互聯網大廠Java求職面試:云原生架構與AI應用集成解決方案

互聯網大廠Java求職面試&#xff1a;云原生架構與AI應用集成解決方案 場景一&#xff1a;短視頻與直播平臺的高并發架構設計 面試官提問 面試官&#xff08;技術總監&#xff09;&#xff1a; 鄭薪苦&#xff0c;你有處理過千萬級用戶同時在線的直播系統嗎&#xff1f;如何設…

RK3588 Opencv-ffmpeg-rkmpp-rkrga編譯與測試

RK3588 Opencv-ffmpeg-rkmpp-rkrga編譯與測試 硬件背景說明編譯環境準備1. 編譯MPP(媒體處理平臺)2. 編譯RGA(圖形加速庫)3. 構建支持硬件加速的FFmpeg重要代碼修改說明4. 驗證安裝5.FFmpeg轉碼測試OpenCV編譯集成Python OpenCV+FFmpeg測試硬件背景說明 RK3588是瑞芯微推出…

解鎖C++遞歸算法:從原理到實戰

遞歸算法初相識 ** 在 C 的奇妙世界里&#xff0c;遞歸算法就像是一把神奇的鑰匙&#xff0c;能夠開啟解決復雜問題的大門。那么&#xff0c;究竟什么是遞歸算法呢&#xff1f;簡單來說&#xff0c;遞歸算法就是一種函數調用自身的編程技巧。當一個函數在其定義中直接或間接地…

vue2+webpack環境變量配置

第一步&#xff1a;創建3個環境變量文件 1、創建> 生產&#xff08;本地&#xff09;環境 .env.development # 開發環境 ENVdevelopment VUE_APP_MEDIA_BASE調后端請求的地址2、創建> 測試環境 .env.staging # 測試環境 ENVstaging VUE_APP_MEDIA_BASE調后端請求的地址…

【通用智能體】Intelligent Internet Agent (II-Agent):面向復雜網絡任務的智能體系統深度解析

Intelligent Internet Agent &#xff08;II-Agent&#xff09;&#xff1a;面向復雜網絡任務的智能體系統深度解析 一、系統架構與設計哲學1.1 核心架構設計1.2 技術創新點1.2.1 動態任務分配機制1.2.2 網絡狀態感知模塊 二、系統架構解析2.1 完整工作流程2.2 性能指標對比 三…

力扣第450場周賽

Q1. 數位和等于下標的最小下標 給你一個整數數組 nums 。 返回滿足 nums[i] 的數位和&#xff08;每一位數字相加求和&#xff09;等于 i 的 最小 下標 i 。 如果不存在滿足要求的下標&#xff0c;返回 -1 。 示例 1&#xff1a; 輸入&#xff1a;nums [1,3,2] 輸出&#xff1…

【氮化鎵】偏置對GaN HEMT 單粒子效應的影響

2025年5月19日,西安電子科技大學的Ling Lv等人在《IEEE Transactions on Electron Devices》期刊發表了題為《Single-Event Effects of AlGaN/GaN HEMTs Under Different Biases》的文章,基于實驗和TCAD仿真模擬方法,研究了單粒子效應對關斷狀態、半開啟狀態和開啟狀態下AlG…

湖北理元理律師事務所債務優化方案:讓還款與生活平衡成為可能

在現代社會&#xff0c;債務問題已經成為影響許多家庭生活質量的重要因素。如何在不影響基本生活的前提下合理規劃還款&#xff0c;是眾多債務人面臨的實際難題。湖北理元理律師事務所推出的債務優化服務&#xff0c;正是針對這一需求而設計的專業解決方案。 該所的債務優化方…

FastJson1.2.24反序列化原理

{"type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://wmqlgxtbil.yutu.eu.org:9999/Exploit", "autoCommit":true} 測試執行 DNS解析記錄 利用JNDI工具進行注入 復現流程 java -jar JNDI-Injection-Explo…

基于Android的點餐系統_springboot+vue

開發語言&#xff1a;Java框架&#xff1a;springboot AndroidJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat12開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系統展示 APP登錄…

Maven 項目介紹

一、Maven 概述? Maven 是一個基于 Java 的項目管理和構建自動化工具&#xff0c;由 Apache 軟件基金會開發。它采用 “約定優于配置”&#xff08;Convention Over Configuration&#xff09;的原則&#xff0c;通過標準化的項目結構和配置&#xff0c;極大地簡化了項目的構建…