深入探討Go語言協程調度:GRM模型解析與優化策略

一、線程調度

1、早期單線程操作系統
  • 一切的軟件都是跑在操作系統上,真正用來干活(計算)的是 CPU
  • 早期的操作系統每個程序就是一個進程,直到一個程序運行完,才能進行下一個進程,就是“單進程時代”
  • 一切的程序只能串行發生

2、多進程/線程時代?
  • 在多進程/多線程的操作系統中,就能解決了阻塞的問題,因為一個進程阻塞 cpu 可以立刻切換到其他進程中去執行
  • 而且調度 cpu 的算法可以保證在運行的進程都可以被分配到 cpu 的運行時間片
  • 這樣從宏觀來看,似乎多個進程是在同時被運行
  • 但新的問題就又出現了,進行擁有太多的資源,進程的創建、切換、銷毀、都會占用很長的時間
  • CPU 雖然利用起來了,但如果進程過多,CPU 有很大的一部分都被用來進行進程調度了
  • 大量的進程/線程都出現了新的問題
    • 高內存占用
    • 調度的高消耗 CPU
    • 進程虛擬內存會占用 4GB[32位操作系統],而線程也要大約 4MB

3、Go 協程 goroutine?
  • Go 中,協程被稱為 goroutine,它非常輕量,一個 goroutine 只占幾 KB,并且這幾 KB 就足夠 goroutine 運行完
  • 這就能在有限的內存空間內支持大量 goroutine;支持了更多的并發
  • 雖然一個 goroutine 的棧只占幾 KB,但實際是可伸縮的,如果需要更多內容,runtime 會自動為 goroutine 分配
  • Goroutine 特點:
    • 占用內存更小(幾 KB)
    • 調度更靈活(runtime 調度)
4、協程域線程區別
  • 協程跟線程是有區別的,線程由 CPU 調度是搶占式的
  • 協程由用戶調度是協作式的,一個協程讓出 cpu 后,才執行下一個協程

二、調度器 GMP 模型

  • G:goroutine(協程)
  • M:thread(內核線程,不是用戶態線程)
  • P:processer(調度器)?
1、GM 模型
  • G(協程)通常在代碼里用 go 關鍵字執行一個方法,那么就等于起了一個 G
  • M(內核線程)操作系統內核其實看不見 G 和 P,只知道自己在執行一個線程
  • G 和 P 都是在用戶層上的實現
  • 并發量小的時候還好,當并發量大了,這把大鎖,就成了性能瓶頸

  • GMP 由來
    • 基于沒有什么是加一個中間層不能解決的思路,golang在原有的GM的基礎上加入了一個調度器P
    • 可以簡單理解為是在G和M中間加了個中間層
    • 于是就有了現在的GMP模型里的P
2、GMP模型

三、GMP流程分析?

  • 我們通過go func()來創建一個goroutine
1、P本地隊列獲取G
  • M想要運行G,就要先獲取P,然后從P的本地隊列獲取G

2、本地隊列中G移動到全局隊列
  • ?新建G時,新G會優先加入到P的本地隊列
  • 如果本地隊列滿了,則會把本地隊列中一半的G移動到全局隊列

3、從其他P本地隊列的G放到自己P隊列
  • ?如果全局隊列為空時,M會從其他P的本地隊列偷(stealing)一半G放到自己P的本地隊列

4、M從P獲取下一個G,不斷重復
  • M運行G,G執行之后,M會從P獲取下一個G,不斷重復下去

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

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

相關文章

ES6中新增的基本數據類型----symbol

前言 Symbol 基本數據類型 獨一無二得值 Symbol函數創建 接收字符串 對symbol值得描述 let s1 Symbol(描述) /*** symbol 基本數據類型 表示獨一無二的值 Symbol函數創建獨一無二得值 參數可以是唯一值得描述*/ let sy1 Symbol();//創建好一個獨一無二得值 let sy2 Symbo…

EXP-00056: 遇到 ORACLE 錯誤 12154 ORA-12154: TNS: 無法解析指定的連接標識符

exp oas/oasoas filed:\daochu.dmp owner(s) 導出特定用戶 //exp 用戶名/密碼數據庫 filed:\daochu.dmp owner(用戶名) 1.重啟oracle監聽 cmd 中輸入 services.msc 找到服務:OracleOraDb10g_home1TNSListener 與 OracleServiceORCL。 把兩個服務啟動. 若未解決…

Vue 3 + Tailwind CSS:打造現代化項目的完美組合

Vue 3 Tailwind CSS:打造現代化項目的完美組合 本篇教程將向你介紹如何將 Tailwind CSS 與 Vue 3 項目搭配使用,為你的項目提供現代化的 UI 呈現和開發體驗。通過本文的逐步演示和示例代碼,你將很快掌握在 Vue 3 中集成和使用 Tailwind CSS…

SCI一區級 | Matlab實現GWO-CNN-BiLSTM-selfAttention多變量多步時間序列預測

SCI一區級 | Matlab實現GWO-CNN-BiLSTM-selfAttention多變量多步時間序列預測 目錄 SCI一區級 | Matlab實現GWO-CNN-BiLSTM-selfAttention多變量多步時間序列預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 1.Matlab實現GWO-CNN-BiLSTM-selfAttention灰狼算法優化卷…

IntelliJ idea卡頓解決,我遇到的比較管用的方案

Setttings> Build, Execution,Deployment>Debugger> Data Views> Java 取消 Enable "toString()" object view; Speed up debugging in IntelliJ Yesterday, I observed painfully slow debugging in IntelliJ. Every step over or step in took almost…

【力扣】234.回文鏈表2

234.回文鏈表2 感覺自己還是有點時間,然后又學了兩種解法。那就一起整理一下。 法一:反轉鏈表后比較 題解看我的這一篇就行(click) 法二:數組雙指針 思路很簡單,就是用while循環遍歷一下整個鏈表將對應的值復制到…

2023年12月8日:UI登陸界面

作業 頭文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMovie> #include <QPushButton> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpub…

GO語言開始

GO語言開始 下載windows版本安裝后查看 是否安裝成功下載GO的集成開發工具第一個GO程序 Go官網地址&#xff1a;https://golang.org/ Go 官方鏡像站&#xff08;推薦&#xff09;:https://golang.google.cn/dl/ 下載windows版本 安裝后查看 是否安裝成功 下載GO的集成開發工具…

鴻蒙原生應用開發【分布式數據對象】

01、什么是分布式數據對象 在可信組網環境下&#xff0c;多個相互組網認證的設備將各自創建的對象加入同一個 sessionId&#xff0c;使得加入的多個數據對象之間可以同步數據&#xff0c;也就是說&#xff0c;當某一數據對象屬性發生變更時&#xff0c;其他數據對象會檢測到這…

前端知識筆記(三十七)———Django與Ajax

特點&#xff1a; 異步提交 局部刷新 例子&#xff1a;github注冊 動態獲取用戶名實時的跟后端確認并實時的展示到前端&#xff08;局部刷新&#xff09; 朝后端發送請求的方式 1.瀏覽器地址欄直接輸入url回車 -----》get請求 2.a標簽的href屬性 -----》get請求 3…

pcl-3 pcl結合opencv做svm分類(法向量特征數據)

后續使用了fpfh特征作為訓練數據&#xff0c;遇到了一些困難 首先是flann沖突&#xff0c;這個將opcv中的flann都改成了flann2就可以運行 后面在將得到的33特征值進行訓練的時候一直內存超限&#xff0c;傳輸的不太好&#xff0c;到現在還是不行&#xff0c;改了三天還是沒有改…

Flink 系列文章匯總索引

Flink 系列文章 一、Flink 專欄 本專欄系統介紹某一知識點&#xff0c;并輔以具體的示例進行說明。 本專欄的文章編號可能不是順序的&#xff0c;主要是因為寫的時候順序沒統一&#xff0c;但相關的文章又引入了&#xff0c;所以后面就沒有調整了&#xff0c;按照寫文章的順…

OpenCL學習筆記(三)手動編譯開發庫(win10+mingw64)

前言 有的小伙伴仍然在使用mingw編譯器&#xff0c;這時只能重新編譯opencl的sdk庫。本文檔簡單記錄下win10下&#xff0c;使用mingw11.20編譯的過程&#xff0c;有需要的小伙伴可以參考下 一、安裝所需軟件 1.安裝git&#xff0c;教程比較多&#xff0c;不再重復 2.安裝cm…

chrome安裝jsonview

寫在前面 通過jsonview可以實現&#xff0c;當http響應時application/json時直接在瀏覽器格式化顯示&#xff0c;增加可讀性。本文看下如何安裝該插件到chrome中。 1&#xff1a;安裝 首先在這里 下載插件包&#xff0c;然后解壓備用。接著在chrome按照如下步驟操作&#xf…

千鋒 Vue 詳細筆記整理

視頻筆記是根據B站 千鋒 濤哥 - SpringBootvue前后端分離項目《鋒迷商城》實戰課-完結版 進行整理的 筆記可上 gitee倉庫 自取 千鋒 Vue 筆記整理 一、vue 的簡介1.1 使用 JQuery 的復雜性問題1.2 VUE 簡介1.2.1 前端框架1.2.2 MVVM 二、 vue 入門使用2.1 vue 的引入2.2 入門案…

WPF(Windows Presentation Foundation)的 StatusBar控件

WPF&#xff08;Windows Presentation Foundation&#xff09;的 StatusBar 是一種用于顯示狀態欄的控件。狀態欄是用于向用戶提供應用程序的狀態信息或其他相關信息的區域。它通常位于應用程序窗口的底部&#xff0c;并提供一些常見的功能&#xff0c;如顯示進度、狀態文本、通…

[C#] 基于 yield 語句的迭代器邏輯懶執行

眾所周知, C# 可以通過 yield 語句來快速向 IEnumerator 或者 IEnumerable 類型的方法返回值返回一個元素. 但它還有另外一個特性, 就是其內部邏輯的懶執行. 每兩個 yield 語句之間的邏輯都是一個狀態, 只有在調用迭代器的 MoveNext 方法后, 才會執行下一個狀態的邏輯. 在文章中…

澤攸科技二維材料轉移臺的應用場景及優勢

隨著二維材料的廣泛研究和各種潛在應用的開發&#xff0c;對于二維材料樣品的精密操控與轉移的需求日益增加。特別是一些新型二維材料的制備和器件集成制備中&#xff0c;需要在顯微鏡下對樣品進行觀察與定位&#xff0c;并能夠在微米甚至納米量級上精確移動和轉移樣品。 傳統…

集簡云 x 零售企業丨快速集成有贊商城和微盛企微管家,實現私域運營自動化

客戶介紹 某公司是一家知名的飲料廠商&#xff0c;自1998年成立以來&#xff0c;一直致力于研發和生產各種熱門飲品&#xff0c;如果汁、碳酸飲料、礦泉水等。因其獨特的口感和健康的品質深受消費者的喜愛。企業擁有多個知名品牌&#xff0c;享有極高的品牌知名度和市場份額。該…

BGP綜合

1、使用PreVal策略&#xff0c;確保R4通過R2到達192.168.10.0/24。 2、使用AS_Path策略&#xff0c;確保R4迪過R3到達192.168.11.0/24。 3、配置MED策略&#xff0c;確保R4通過R3到達192.168.12.0/24。 4、使用Local Preference策略&#xff0c;確保R1通過R2到達192.168.1.0…