最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解golang中的gmp模型

 更新時(shí)間:2023年11月15日 11:07:44   作者:wric  
這篇文章主要介紹了golang中的gmp模型的誕生、概念及調(diào)度講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

誕生

(我們?yōu)槭裁葱枰猤mp模型)

我們知道,早期的操作系統(tǒng)操作系統(tǒng)是單進(jìn)程的。后來引入了并發(fā)的思想,發(fā)展為多進(jìn)程/多線程操作系統(tǒng),操作系統(tǒng)可以通過時(shí)間片在多個(gè)進(jìn)程之間切換。然而,在多個(gè)進(jìn)程之間進(jìn)行切換,是需要切換成本的。

在引入?yún)f(xié)程之前,我們需要回顧一下進(jìn)程和線程的概念。
進(jìn)程,是軟件的執(zhí)行副本,是分配資源的基礎(chǔ)單位。每個(gè)進(jìn)程有自己的進(jìn)程控制塊,代碼,數(shù)據(jù)。
線程,是輕量級(jí)的線程,是調(diào)度和執(zhí)行的基本單位。(這里單指內(nèi)核態(tài)線程),每個(gè)線程有自己的寄存器和棧。

時(shí)間與空間

在傳統(tǒng)的多線程并發(fā)模型中,輕量級(jí)的線程只需進(jìn)行寄存器和棧等上下文的切換就可以完成多個(gè)任務(wù)的并發(fā)執(zhí)行。然而,隨著并發(fā)量越來越高,有些局限性開始展現(xiàn)出來。

隨著并發(fā)量的上漲,切換的頻率越來越高,線程的切換開銷開始顯露不足
隨著并發(fā)量的上漲,需要越來越多的線程,內(nèi)存占用也越來越大

因此,在高并發(fā)的需求下,協(xié)程因此誕生了,也就是golang中的groutine。

在時(shí)間上,平均每次協(xié)程切換的開銷是 120ns 左右,相對(duì)于進(jìn)程切換的開銷大約 3.5us,大約是其的三十分之一
在空間上,協(xié)程初始化創(chuàng)建的時(shí)候?yàn)槠浞峙涞臈S?2KB,而線程棧一般在4-8M左右。

那么,為什么協(xié)程可以這么輕量呢。

在傳統(tǒng)的多線程中,線程與進(jìn)程的關(guān)系是固定的,每個(gè)線程必定從屬于一個(gè)進(jìn)程。而到了協(xié)程,為了去掉更多的枷鎖,協(xié)程是不依賴于某個(gè)固定的線程的,協(xié)程可以自由切換而不比。換而言之,golang在用戶空間與內(nèi)核空間之間創(chuàng)建了一層新的映射,而這,就是gmp模型。

概念

(gmp是什么)

gmp=groutine+machine+processor

G

  • (1) g 即goroutine,是golang中對(duì)協(xié)程的抽象;
  • (2) g有自己的運(yùn)行棧、狀態(tài)、以及執(zhí)行的任務(wù)函數(shù)(用戶通過go func指定);
  • (3) g需要綁定到p才能執(zhí)行,在g的視角中,p就是它的cpu.

M

  • (1) m 即machine,是golang 中對(duì)線程的抽象;
  • (2) m的數(shù)量是動(dòng)態(tài)的,golang語言中默認(rèn)最大值為10000,也可以用runtime/debug包中的SetMaxThreads函數(shù)來設(shè)置
  • (3) ?個(gè)M阻塞,會(huì)創(chuàng)建?個(gè)新的M。如果有M空閑,那么就會(huì)回收或者睡眠。

P

  • (1) p即 processor,是golang 中的調(diào)度器;
  • (2) p是 gmp的中樞,借由p承上啟下,實(shí)現(xiàn)g 和m之間的動(dòng)態(tài)有機(jī)結(jié)合;
  • (3)對(duì)g而言,p是其cpu,g只有被p調(diào)度,才得以執(zhí)行;
  • (4)對(duì)m而言,p是其執(zhí)行代理,為其提供必要信息的同時(shí)(可執(zhí)行的g、內(nèi)存分配情況等),并隱藏了繁雜的調(diào)度細(xì)節(jié);
  • (5) p 的數(shù)量決定了g最大并行數(shù)量,可由用戶通過GOMAXPROCS進(jìn)行設(shè)定(超過CPu核數(shù)時(shí)無意義).也可以在程序中通過runtime.GOMAXPROCS() 來設(shè)置

gmp模型圖片

調(diào)度

調(diào)度策略1 work steal
自己的本地隊(duì)列為空時(shí),會(huì)去別的本地隊(duì)列偷取一半,保證有任務(wù)可以執(zhí)行。

調(diào)度策略2 hand off
當(dāng)一個(gè)綁定了M的G發(fā)生阻塞,會(huì)創(chuàng)建/喚醒

調(diào)度策略3 并行
最多有GOMAXPROCS個(gè)線程分布在多個(gè)CPU上同時(shí)運(yùn)?

調(diào)度策略4 搶占
在Go中,?個(gè)goroutine最多占?CPU 10ms,防?其他goroutine被餓死

調(diào)度策略5 全局隊(duì)列
當(dāng)M執(zhí)?work stealing從其他P偷不到G時(shí),它可以從全局G隊(duì)列獲取G。

以上就是詳解golang中的gmp模型的詳細(xì)內(nèi)容,更多關(guān)于詳解golang中的gmp模型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Bililive-go 實(shí)現(xiàn)直播自動(dòng)監(jiān)控錄制功能

    Bililive-go 實(shí)現(xiàn)直播自動(dòng)監(jiān)控錄制功能

    最近有直播錄制的需求,但是自己手動(dòng)錄制太麻煩繁瑣,于是用了開源項(xiàng)目Bililive-go進(jìn)行全自動(dòng)監(jiān)控錄制,對(duì)Bililive-go 直播自動(dòng)監(jiān)控錄制實(shí)現(xiàn)思路感興趣的朋友,一起看看吧
    2024-03-03
  • golang 實(shí)現(xiàn)一個(gè)restful微服務(wù)的操作

    golang 實(shí)現(xiàn)一個(gè)restful微服務(wù)的操作

    這篇文章主要介紹了golang 實(shí)現(xiàn)一個(gè)restful微服務(wù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Golang極簡(jiǎn)入門教程(四):編寫第一個(gè)項(xiàng)目

    Golang極簡(jiǎn)入門教程(四):編寫第一個(gè)項(xiàng)目

    這篇文章主要介紹了Golang極簡(jiǎn)入門教程(四):編寫第一個(gè)項(xiàng)目,本文講解了workspace、包路徑、第一個(gè)可執(zhí)行命令等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • Go語言如何獲取網(wǎng)卡信息

    Go語言如何獲取網(wǎng)卡信息

    Go語言中net和pcap包提供網(wǎng)絡(luò)接口信息獲取函數(shù),如Interfaces()和FindAllDevs(),通過匹配IP地址關(guān)聯(lián)不同接口數(shù)據(jù),用于網(wǎng)絡(luò)監(jiān)控與分析
    2025-07-07
  • Go語言實(shí)戰(zhàn)之切片內(nèi)存優(yōu)化

    Go語言實(shí)戰(zhàn)之切片內(nèi)存優(yōu)化

    Go 語言的切片是一個(gè)動(dòng)態(tài)的數(shù)據(jù)結(jié)構(gòu),可以方便地對(duì)其進(jìn)行擴(kuò)容和縮容操作。這篇文章主要為大家詳細(xì)介紹了Go語言如何實(shí)現(xiàn)切片內(nèi)存優(yōu)化,需要的可以參考一下
    2023-03-03
  • go 如何修改postgresql的配置參數(shù)

    go 如何修改postgresql的配置參數(shù)

    這篇文章主要介紹了go 如何修改postgresql的配置參數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • Golang中panic的異常處理

    Golang中panic的異常處理

    本文主要介紹了Golang中panic的異常處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • golang與非golang程序探測(cè)beyla源碼解讀

    golang與非golang程序探測(cè)beyla源碼解讀

    這篇文章主要為大家介紹了beyla源碼解讀之golang與非golang程序的探測(cè)實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • golang實(shí)現(xiàn)頁面靜態(tài)化操作的示例代碼

    golang實(shí)現(xiàn)頁面靜態(tài)化操作的示例代碼

    這篇文章主要介紹了golang實(shí)現(xiàn)頁面靜態(tài)化操作的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • golang獲取網(wǎng)卡信息操作

    golang獲取網(wǎng)卡信息操作

    這篇文章主要介紹了golang獲取網(wǎng)卡信息操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評(píng)論

平原县| 健康| 瑞金市| 上饶县| 洞口县| 郧西县| 朝阳市| 儋州市| 卫辉市| 绥中县| 文山县| 重庆市| 普宁市| 兴城市| 孝昌县| 静海县| 湖北省| 普兰县| 迁安市| 南乐县| 饶平县| 拉孜县| 专栏| 穆棱市| 资阳市| 赞皇县| 霞浦县| 桂阳县| 新兴县| 九龙县| 遂宁市| 墨江| 井陉县| 抚顺市| 扎鲁特旗| 利川市| 金门县| 仁化县| 崇义县| 阿尔山市| 吉林市|