欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

這樣就會導致進程阻塞的話,CPU就會卡在當前進程,一直在等待,CPU就會浪費

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

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

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

因此軟件的目標就是提高CPU利用率

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

1:N模型

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

在這里插入圖片描述

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

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

M:N模型

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

goroutine

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

goroutine早期調(diào)度器

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

這樣的問題是激烈的鎖競爭

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

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

GMP

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

在這里插入圖片描述

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

 復用線程

work stealing

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

在這里插入圖片描述

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

在這里插入圖片描述

hand off

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

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

在這里插入圖片描述

并行

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

搶占

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

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

全局隊列

在這里插入圖片描述

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

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

相關(guān)文章

  • Go語言異常處理案例解析

    Go語言異常處理案例解析

    這篇文章主要介紹了Go語言異常處理案例解析,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 深入了解Go語言中context的用法

    深入了解Go語言中context的用法

    這篇文章主要為大家詳細介紹了Go語言中context用法的相關(guān)知識,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-07-07
  • Go語言題解LeetCode888公平糖果交換示例詳解

    Go語言題解LeetCode888公平糖果交換示例詳解

    這篇文章主要為大家介紹了Go語言題解LeetCode888公平糖果交換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Golang遞歸獲取目錄下所有文件方法實例

    Golang遞歸獲取目錄下所有文件方法實例

    這篇文章主要給大家介紹了關(guān)于Golang遞歸獲取目錄下所有文件的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-02-02
  • Go語言實現(xiàn)ssh&scp的方法詳解

    Go語言實現(xiàn)ssh&scp的方法詳解

    這篇文章主要為大家詳細介紹了如何利用Go語言實現(xiàn)ssh&scp,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以了解一下
    2022-10-10
  • Go語言實現(xiàn)聊天小工具的示例代碼

    Go語言實現(xiàn)聊天小工具的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Go語言實現(xiàn)聊天小工具,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • CGO編程基礎(chǔ)快速入門

    CGO編程基礎(chǔ)快速入門

    這篇文章主要為大家介紹了CGO編程基礎(chǔ)快速入門示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 解決golang在import自己的包報錯的問題

    解決golang在import自己的包報錯的問題

    這篇文章主要介紹了解決golang在import自己的包報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go?基本數(shù)據(jù)類型與字符串相互轉(zhuǎn)換方法小結(jié)

    Go?基本數(shù)據(jù)類型與字符串相互轉(zhuǎn)換方法小結(jié)

    這篇文章主要介紹了Go基本數(shù)據(jù)類型與字符串相互轉(zhuǎn)換,將string類型轉(zhuǎn)換成基本類型時,必須確保string類型是有效的,文中補充介紹了Go基本數(shù)據(jù)類型和其字符串表示之間轉(zhuǎn)換,結(jié)合實例代碼給大家講解的非常詳細,需要的朋友可以參考下
    2024-01-01
  • Go語言學習之接口使用的示例詳解

    Go語言學習之接口使用的示例詳解

    Go語言并沒有類的定義,接口可以說Go語言最接近于類的實現(xiàn)方式,但是更輕量。本文將通過一些簡單的示例和大家介紹下Go語言中接口的使用,感興趣的可以學習一下
    2022-11-11

最新評論