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

一文理解Goland協(xié)程調(diào)度器scheduler的實(shí)現(xiàn)

 更新時間:2022年06月06日 15:41:47   作者:樹獺叔叔  
本文主要介紹了Goland協(xié)程調(diào)度器scheduler的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. 調(diào)度器scheduler的作用

我們都知道,在Go語言中,程序運(yùn)行的最小單元是gorouines。

然而程序的運(yùn)行最終都是要交給操作系統(tǒng)來執(zhí)行的,以Java為例,Java中的一個線程對應(yīng)的就是操作系統(tǒng)中的線程,以此來實(shí)現(xiàn)在操作系統(tǒng)中的運(yùn)行。在Go中,gorouines比線程更輕量級,其與操作系統(tǒng)的線程也不是一一對應(yīng)的關(guān)系,然而,最終我們想要執(zhí)行程序,還是要借助操作系統(tǒng)的線程來完成,調(diào)度器scheduler的工作就是完成gorouines到操作系統(tǒng)線程的調(diào)度。

2. GMP模型

當(dāng)我們運(yùn)行go fun(){}時,會生成一個g,優(yōu)先放置在創(chuàng)建他的p的本地隊(duì)列中,如果本地隊(duì)列已滿,那么會放置在全局隊(duì)列中。

g的運(yùn)行需要借助p與m,p是執(zhí)行器,只有獲得p的g才能執(zhí)行,p的執(zhí)行需要掛在m上,m對應(yīng)的是操作系統(tǒng)中的線程,p的數(shù)量與CPU的核數(shù)相同。

goroutine運(yùn)行所需要的上下文信息都是存放在g的數(shù)據(jù)結(jié)構(gòu)當(dāng)中的,所以g可以依靠任意的p或者m執(zhí)行,而對于操作系統(tǒng)而言,其并不能看到p與g的調(diào)度過程,這些過程對于操作系統(tǒng)線程來說都是連續(xù)的,所以省去了線程上下文切換的開銷。

g的數(shù)據(jù)結(jié)構(gòu)如下所示:

type g struct {
    stack       stack   // g自己的棧

    m            *m      // 執(zhí)行當(dāng)前g的m
    sched        gobuf   // 保存了g的現(xiàn)場,goroutine切換時通過它來恢復(fù)
    atomicstatus uint32  // g的狀態(tài)Gidle,Grunnable,Grunning,Gsyscall,Gwaiting,Gdead
    goid         int64
    schedlink    guintptr // 下一個g, g鏈表

    preempt       bool //搶占標(biāo)記

    lockedm        muintptr // 鎖定的M,g中斷恢復(fù)指定M執(zhí)行
    gopc           uintptr  // 創(chuàng)建該goroutine的指令地址
    startpc        uintptr  // goroutine 函數(shù)的指令地址
}

p的數(shù)據(jù)結(jié)構(gòu)如下所示:

type p struct {
    id          int32
    status      uint32 // 狀態(tài)
    link        puintptr // 下一個P, P鏈表
    m           muintptr // 擁有這個P的M
    mcache      *mcache  

    // P本地runnable狀態(tài)的G隊(duì)列
    runqhead uint32
    runqtail uint32
    runq     [256]guintptr
    
    runnext guintptr // 一個比runq優(yōu)先級更高的runnable G

    // 狀態(tài)為dead的G鏈表,在獲取G時會從這里面獲取
    gFree struct {
        gList
        n int32
    }

    gcBgMarkWorker       guintptr // (atomic)
    gcw gcWork

}

m的數(shù)據(jù)結(jié)構(gòu)如下所示:

type m struct {
    g0      *g     // g0, 每個M都有自己獨(dú)有的g0

    curg          *g       // 當(dāng)前正在運(yùn)行的g
    p             puintptr // 當(dāng)前用于的p
    nextp         puintptr // 當(dāng)m被喚醒時,首先擁有這個p
    id            int64
    spinning      bool // 是否處于自旋

    park          note
    alllink       *m // on allm
    schedlink     muintptr // 下一個m, m鏈表
    mcache        *mcache  // 內(nèi)存分配
    lockedg       guintptr // 和 G 的lockedm對應(yīng)
    freelink      *m // on sched.freem

} 

通過gmp模型,我們能解決gorouines到操作系統(tǒng)線程的映射問題,gorouines之間的切換是在用戶態(tài)完成的,在操作系統(tǒng)的視角來看,線程的上下文切換并不頻繁,因此就少了很多陷入內(nèi)核的過程,所以有更好的并發(fā)效果。

3. 調(diào)度機(jī)制

1)work stealing機(jī)制

當(dāng)一個p上的g執(zhí)行完之后,他會嘗試從其他的p隊(duì)列中竊取g來執(zhí)行,以減少操作系統(tǒng)線程的切換動作。

2)hand off機(jī)制

這個是針對m來說的,有的時候m可能因?yàn)間的信號調(diào)用而被操作系統(tǒng)阻塞,這個時候p就會掛載去另一個m繼續(xù)執(zhí)行可以執(zhí)行的g,當(dāng)阻塞的m就緒之后,會給p發(fā)信號,召喚他回來繼續(xù)進(jìn)行后續(xù)操作。

到此這篇關(guān)于一文理解Goland協(xié)程調(diào)度器scheduler的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Goland協(xié)程調(diào)度器scheduler內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go調(diào)度器學(xué)習(xí)之協(xié)作與搶占詳解

    Go調(diào)度器學(xué)習(xí)之協(xié)作與搶占詳解

    如果某個G執(zhí)行時間過長,其他的G如何才能被正常調(diào)度,這就引出了接下來的話題:協(xié)作與搶占。本文將通過一些示例為大家詳細(xì)講講調(diào)度器中協(xié)作與搶占的相關(guān)知識,需要的可以參考一下
    2023-04-04
  • 創(chuàng)建Go工程化項(xiàng)目布局詳解

    創(chuàng)建Go工程化項(xiàng)目布局詳解

    這篇文章主要介紹了創(chuàng)建Go工程化項(xiàng)目布局詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Go開源項(xiàng)目分布式唯一ID生成系統(tǒng)

    Go開源項(xiàng)目分布式唯一ID生成系統(tǒng)

    這篇文章主要為大家介紹了Go開源項(xiàng)目分布式唯一ID生成系統(tǒng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go框架自動化工具Beego使用詳解

    Go框架自動化工具Beego使用詳解

    這篇文章主要為大家介紹了Go框架自動化工具Beego使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Golang如何交叉編譯各個平臺的二進(jìn)制文件詳解

    Golang如何交叉編譯各個平臺的二進(jìn)制文件詳解

    這篇文章主要給大家介紹了關(guān)于Golang如何交叉編譯各個平臺的二進(jìn)制文件的相關(guān)資料,并介紹了golang如何讓編譯生產(chǎn)的二進(jìn)制文件變小,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • golang查看CPU使用率與內(nèi)存的方法詳解

    golang查看CPU使用率與內(nèi)存的方法詳解

    這篇文章主要給大家介紹了golang查看CPU使用率與內(nèi)存的方法,以及拓展介紹源碼里//go:指令,文中有詳細(xì)的代碼示例以及圖文介紹,需要的朋友可以參考下
    2023-10-10
  • 基于golang中container/list包的用法說明

    基于golang中container/list包的用法說明

    這篇文章主要介紹了基于golang中container/list包的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • go開源Hugo站點(diǎn)構(gòu)建三步曲之集結(jié)渲染

    go開源Hugo站點(diǎn)構(gòu)建三步曲之集結(jié)渲染

    這篇文章主要為大家介紹了go開源Hugo站點(diǎn)構(gòu)建三步曲之集結(jié)渲染詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • golang小游戲開發(fā)實(shí)戰(zhàn)之飛翔的小鳥

    golang小游戲開發(fā)實(shí)戰(zhàn)之飛翔的小鳥

    這篇文章主要給大家介紹了關(guān)于golang小游戲開發(fā)實(shí)戰(zhàn)之飛翔的小鳥的相關(guān)資料,,本文可以帶你你從零開始,一步一步的開發(fā)出這款小游戲,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • 一文教你如何用好GO語言變長參數(shù)

    一文教你如何用好GO語言變長參數(shù)

    對于函數(shù)重載相信編碼過的?xdm?肯定不會陌生,那么我們一起分別來看看?C?語言,C++?語言,GO?語言?如何去模擬和使用重載,感興趣的可以學(xué)習(xí)一下
    2023-09-09

最新評論