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

Go并發(fā)的方法之goroutine模型與調(diào)度策略

 更新時(shí)間:2021年11月17日 16:35:23   作者:朱驥倫  
在go中,協(xié)程co-routine被改為goroutine,一個(gè)goroutine只占幾kb,因此可以有大量的goroutine存在,另一方面goroutine 的調(diào)度器非常靈活,本文給大家介紹下Go并發(fā)的方法之goroutine模型與調(diào)度策略,感興趣的朋友一起看看吧

學(xué)習(xí)劉丹冰《8小時(shí)轉(zhuǎn)職golang工程師》,本節(jié)都是原理

單進(jìn)程操作系統(tǒng)

早期的單進(jìn)程操作系統(tǒng),可以理解為只有一個(gè)時(shí)間軸,CPU順序執(zhí)行每一個(gè)進(jìn)程/線程,這種順序執(zhí)行的方式,CPU同一時(shí)間智能處理一個(gè)指令,一個(gè)任務(wù)一個(gè)任務(wù)去處理

這樣就會(huì)導(dǎo)致進(jìn)程阻塞的話,CPU就會(huì)卡在當(dāng)前進(jìn)程,一直在等待,CPU就會(huì)浪費(fèi)

多線程/多進(jìn)程操作系統(tǒng)

CPU利用輪詢機(jī)制,調(diào)度各個(gè)進(jìn)程,每個(gè)進(jìn)程都分配固定的時(shí)間片,這個(gè)時(shí)間片很小,先執(zhí)行進(jìn)程A,如果A結(jié)束了,那沒問題切換到下一進(jìn)程B,但如果時(shí)間片內(nèi)A沒結(jié)束,CPU不管A沒結(jié)束,會(huì)強(qiáng)制切換到下一進(jìn)程B,以此類推,CPU就避免了阻塞在某一進(jìn)程

但這樣的問題是,在頻繁切換進(jìn)程的過程中,進(jìn)程的切換就必然會(huì)導(dǎo)致切換成本,例如保存當(dāng)前線程狀態(tài),系統(tǒng)調(diào)用,環(huán)境的上下文切換,各種拷貝復(fù)制就會(huì)導(dǎo)致時(shí)間浪費(fèi),大部分時(shí)間都用在切換了,進(jìn)程數(shù)量越多,切換的浪費(fèi)就越大

因此軟件的目標(biāo)就是提高CPU利用率

另一方面,進(jìn)程的內(nèi)存占用也是很大的問題

1:N模型

程序員的任務(wù)就是在用戶態(tài)調(diào)接口,開發(fā)業(yè)務(wù),內(nèi)核態(tài)負(fù)責(zé)調(diào)硬件,調(diào)系統(tǒng)資源,用戶線程和內(nèi)核線程一一綁定,CPU只需要管內(nèi)核線程,這樣的內(nèi)核線程稱為thread,用戶線程稱為co-routine,thread通過管理協(xié)程調(diào)度器,管理多個(gè)協(xié)程,這樣CPU還是只管理一個(gè)線程

在這里插入圖片描述

這樣就在用戶態(tài)實(shí)現(xiàn)了并發(fā),CPU也不用切換了,只用在協(xié)程切換時(shí)消耗很少的資源,解決了CPU高消耗調(diào)度的問題

這樣的弊端是有一個(gè)協(xié)程阻塞了,下一個(gè)協(xié)程就不能執(zhí)行了

M:N模型

M個(gè)線程通過協(xié)程調(diào)度器,管理多個(gè)協(xié)程,CPU的調(diào)度優(yōu)化我們沒法做,這個(gè)協(xié)程調(diào)度器就非常重要了

goroutine

在go中,協(xié)程co-routine被改為goroutine,一個(gè)goroutine只占幾kb,因此可以有大量的goroutine存在,另一方面goroutine 的調(diào)度器非常靈活

goroutine早期調(diào)度器

早期的goroutine調(diào)度器有一個(gè)全局的goroutine隊(duì)列,這個(gè)隊(duì)列有一個(gè)鎖,每個(gè)線程要?jiǎng)?chuàng)建、銷毀、運(yùn)行一個(gè)goroutine都要先獲取一個(gè)鎖,然后執(zhí)行g(shù)oroutine,執(zhí)行完畢后再把鎖還回去

這樣的問題是激烈的鎖競(jìng)爭(zhēng)

另一方面,當(dāng)一個(gè)線程執(zhí)行一個(gè)goroutine時(shí),這個(gè)goroutine新創(chuàng)建了一個(gè)goroutine,為了保證并發(fā),這個(gè)新goroutine肯定得執(zhí)行,這個(gè)新創(chuàng)建的就被放在下一個(gè)線程去執(zhí)行,這實(shí)際上不滿足程序的局部性原理

另外系統(tǒng)在頻繁調(diào)用不同的線程還是會(huì)造成系統(tǒng)開銷

GMP

在操作系統(tǒng)中,有一個(gè)操作系統(tǒng)調(diào)度器,用來調(diào)度CPU,來處理不同的內(nèi)核線程,在這之上每個(gè)線程有一個(gè)處理器,這個(gè)處理器里有g(shù)oroutine的各種資源,堆、棧、數(shù)據(jù)等,這樣的處理器稱為P,每個(gè)P管理一個(gè)自己的本地隊(duì)列,這個(gè)隊(duì)列里存放著這個(gè)P要處理的goroutine,goroutine要被處理時(shí),線程獲取一個(gè)P,P調(diào)度出一個(gè)goroutine交給線程,線程對(duì)goroutine進(jìn)行處理,除了P的本地隊(duì)列外,還有一個(gè)全局隊(duì)列,里面也存放著要運(yùn)行的goroutine

在這里插入圖片描述

調(diào)度器設(shè)計(jì)策略

 復(fù)用線程

work stealing

當(dāng)一個(gè)線程正在執(zhí)行一個(gè)goroutine時(shí),并且它的P本地隊(duì)列里還有待執(zhí)行的goroutine,別的P空閑的話就會(huì)幫它的線程偷取一個(gè)goroutine

在這里插入圖片描述

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

在這里插入圖片描述

hand off

如果說一個(gè)P正執(zhí)行的goroutine突然阻塞了,比如在等待輸入之類的,那么這時(shí)候這個(gè)P的線程,也就是這個(gè)CPU實(shí)際上沒有被利用,這時(shí)候就會(huì)創(chuàng)建/喚醒一個(gè)新的線程,這時(shí)候讓阻塞的goroutine繼續(xù)阻塞,當(dāng)前CPU變?yōu)樗郀顟B(tài),但把物理CPU切換走到不阻塞的線程上,其余的P和P的本地隊(duì)列直接被轉(zhuǎn)移到新的線程上控制,如果之前的阻塞routine又不阻塞了,那把這個(gè)goroutine又加入到別的隊(duì)列后
在這里插入圖片描述

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

在這里插入圖片描述

并行

P的數(shù)量可以宏定義,例如為CPU核心數(shù)/2

搶占

在1:1模型中,一個(gè)協(xié)程和一個(gè)線程綁定,當(dāng)有別的協(xié)程需要運(yùn)行時(shí),當(dāng)前的協(xié)程除非釋放出這個(gè)線程資源,否則新來的就只能等著

而goroutine的機(jī)制是,每個(gè)goroutine只有10ms,時(shí)間用完后新的goroutine一定會(huì)搶占這個(gè)CPU,沒有誰優(yōu)先,大家都很平均

全局隊(duì)列

在這里插入圖片描述

一個(gè)線程如果沒有要執(zhí)行的goroutine,根據(jù)work stealing,去別的本地隊(duì)列偷,如果別的隊(duì)列也沒得偷,就去全局隊(duì)列里拿,全局隊(duì)列里別的goroutine前移

到此這篇關(guān)于Go并發(fā)的方法之goroutine模型與調(diào)度策略的文章就介紹到這了,更多相關(guān)Go goroutine模型與調(diào)度策略內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang執(zhí)行cmd命令行的方法

    Golang執(zhí)行cmd命令行的方法

    本文主要介紹了Golang執(zhí)行cmd命令行的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Golang流程控制語句的具體使用

    Golang流程控制語句的具體使用

    在編寫程序時(shí),流程控制是必不可少的一部分,本文主要介紹了Golang流程控制語句的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 使用Golang的channel交叉打印兩個(gè)數(shù)組的操作

    使用Golang的channel交叉打印兩個(gè)數(shù)組的操作

    這篇文章主要介紹了使用Golang的channel交叉打印兩個(gè)數(shù)組的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Golang中的四個(gè)括號(hào)示例詳解

    Golang中的四個(gè)括號(hào)示例詳解

    這篇文章主要介紹了Golang中的四個(gè)括號(hào),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),通過實(shí)例代碼補(bǔ)充介紹了有效的括號(hào)golang實(shí)現(xiàn),需要的朋友可以參考下
    2024-03-03
  • 使用Go語言進(jìn)行安卓開發(fā)的詳細(xì)教程

    使用Go語言進(jìn)行安卓開發(fā)的詳細(xì)教程

    本文將介紹如何使用Go語言進(jìn)行安卓開發(fā),我們將探討使用Go語言進(jìn)行安卓開發(fā)的優(yōu)點(diǎn)、準(zhǔn)備工作、基本概念和示例代碼,通過本文的學(xué)習(xí),你將了解如何使用Go語言構(gòu)建高效的安卓應(yīng)用程序,需要的朋友可以參考下
    2023-11-11
  • Go語言加解密利器之go-crypto庫用法解析

    Go語言加解密利器之go-crypto庫用法解析

    在軟件開發(fā)中,數(shù)據(jù)安全和隱私保護(hù)越來越受到重視,go-crypto?庫應(yīng)運(yùn)而生,它是一個(gè)專為?Golang?設(shè)計(jì)的加密解密工具庫,下面就跟隨小編一起來看看它的具體使用吧
    2024-11-11
  • Go語言開發(fā)kube-scheduler整體架構(gòu)深度剖析

    Go語言開發(fā)kube-scheduler整體架構(gòu)深度剖析

    這篇文章主要為大家介紹了Go語言開發(fā)kube-scheduler整體架構(gòu)深度剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Golang中fsnotify包監(jiān)聽文件變化的原理詳解

    Golang中fsnotify包監(jiān)聽文件變化的原理詳解

    Golang提供了一個(gè)強(qiáng)大的fsnotify包,它能夠幫助我們輕松實(shí)現(xiàn)文件系統(tǒng)的監(jiān)控,本文將深入探討fsnotify包的原理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • Golang實(shí)現(xiàn)支持多種類型的set

    Golang實(shí)現(xiàn)支持多種類型的set

    在項(xiàng)目開發(fā)中,常常會(huì)用到set去重,為什么不寫一個(gè)set呢,而且go現(xiàn)在支持了泛型,所以本文就來用Golang實(shí)現(xiàn)一個(gè)支持多種類型的set呢
    2023-05-05
  • 詳解Go語言如何判斷兩個(gè)對(duì)象是否相等

    詳解Go語言如何判斷兩個(gè)對(duì)象是否相等

    在編程中,判斷兩個(gè)對(duì)象是否相等是一項(xiàng)常見的任務(wù),同時(shí)判斷對(duì)象是否相等在很多情況下都非常重要,所以在接下來的內(nèi)容中,我們將詳細(xì)介紹在?Go?語言中如何判斷對(duì)象是否相等的方法和技巧,需要的可以參考一下
    2023-06-06

最新評(píng)論

广平县| 惠安县| 利津县| 长垣县| 南开区| 石首市| 达日县| 霍州市| 湖南省| 普定县| 山东| 睢宁县| 白朗县| 抚顺县| 利川市| 蓝田县| 石景山区| 塔河县| 滨州市| 于都县| 咸丰县| 鄂托克前旗| 夏津县| 万年县| 巨野县| 广西| 永寿县| 独山县| 德阳市| 慈利县| 柘荣县| 临西县| 项城市| 开原市| 景宁| 福泉市| 南康市| 曲松县| 安远县| 阳山县| 新疆|