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

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

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

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

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

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

2. GMP模型

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

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

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

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

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

    m            *m      // 執(zhí)行當(dāng)前g的m
    sched        gobuf   // 保存了g的現(xiàn)場(chǎng),goroutine切換時(shí)通過(guò)它來(lái)恢復(fù)
    atomicstatus uint32  // g的狀態(tài)Gidle,Grunnable,Grunning,Gsyscall,Gwaiting,Gdead
    goid         int64
    schedlink    guintptr // 下一個(gè)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 // 下一個(gè)P, P鏈表
    m           muintptr // 擁有這個(gè)P的M
    mcache      *mcache  

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

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

    gcBgMarkWorker       guintptr // (atomic)
    gcw gcWork

}

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

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

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

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

} 

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

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

1)work stealing機(jī)制

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

2)hand off機(jī)制

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

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

相關(guān)文章

  • Go語(yǔ)言中Gin框架使用JWT實(shí)現(xiàn)登錄認(rèn)證的方案

    Go語(yǔ)言中Gin框架使用JWT實(shí)現(xiàn)登錄認(rèn)證的方案

    在如今前后端分離開(kāi)發(fā)的大環(huán)境中,我們需要解決一些登陸,后期身份認(rèn)證以及鑒權(quán)相關(guān)的事情,通常的方案就是采用請(qǐng)求頭攜帶token的方式進(jìn)行實(shí)現(xiàn),本文給大家介紹了Go語(yǔ)言中Gin框架使用JWT實(shí)現(xiàn)登錄認(rèn)證的方案,需要的朋友可以參考下
    2024-11-11
  • 記一次go語(yǔ)言使用time.Duration類型踩過(guò)的坑

    記一次go語(yǔ)言使用time.Duration類型踩過(guò)的坑

    本文主要介紹了記一次go語(yǔ)言使用time.Duration類型踩過(guò)的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 自定義Go?Json的序列化方法譯文

    自定義Go?Json的序列化方法譯文

    這篇文章主要為大家介紹了自定義Go?Json序列化方法譯文,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 使用Golang實(shí)現(xiàn)AES加解密的代碼示例

    使用Golang實(shí)現(xiàn)AES加解密的代碼示例

    在現(xiàn)代的數(shù)據(jù)安全中,加密和解密是極其重要的一環(huán),其中,高級(jí)加密標(biāo)準(zhǔn)(AES)是最廣泛使用的加密算法之一,本文將介紹如何使用Golang來(lái)實(shí)現(xiàn)AES加密和解密,需要的朋友可以參考下
    2024-04-04
  • Golang: 內(nèi)建容器的用法

    Golang: 內(nèi)建容器的用法

    這篇文章主要介紹了Golang: 內(nèi)建容器的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Go語(yǔ)言中int、float、string類型之間相互的轉(zhuǎn)換

    Go語(yǔ)言中int、float、string類型之間相互的轉(zhuǎn)換

    golang是強(qiáng)類型語(yǔ)言,在應(yīng)用過(guò)程中類型轉(zhuǎn)換基本都會(huì)用到,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中int、float、string類型相互之間的轉(zhuǎn)換,需要的朋友可以參考下
    2022-01-01
  • 解決Golang 中使用WaitGroup的那點(diǎn)坑

    解決Golang 中使用WaitGroup的那點(diǎn)坑

    這篇文章主要介紹了解決Golang 中使用WaitGroup的那點(diǎn)坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Golang?中判斷兩個(gè)結(jié)構(gòu)體相等的方法

    Golang?中判斷兩個(gè)結(jié)構(gòu)體相等的方法

    這篇文章主要介紹了Golang?中如何判斷兩個(gè)結(jié)構(gòu)體相等,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Golang信號(hào)量設(shè)計(jì)實(shí)現(xiàn)示例詳解

    Golang信號(hào)量設(shè)計(jì)實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了Golang信號(hào)量設(shè)計(jì)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Golang創(chuàng)建第一個(gè)web項(xiàng)目(Gin+Gorm)

    Golang創(chuàng)建第一個(gè)web項(xiàng)目(Gin+Gorm)

    本文主要介紹了Golang創(chuàng)建第一個(gè)web項(xiàng)目(Gin+Gorm),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06

最新評(píng)論

循化| 宁海县| 荣昌县| 宜兴市| 临漳县| 莱阳市| 大石桥市| 新乡市| 依安县| 舟曲县| 中西区| 蓝山县| 东乌| 子洲县| 永胜县| 华阴市| 和平区| 南投县| 保亭| 兰溪市| 无棣县| 台山市| 无棣县| 三台县| 临安市| 航空| 龙游县| 金坛市| 阿荣旗| 新巴尔虎右旗| 从江县| 正蓝旗| 师宗县| 江永县| 手游| 淳安县| 平泉县| 湘乡市| 吐鲁番市| 杭州市| 虹口区|