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

一文詳解Golang協(xié)程調度器scheduler

 更新時間:2022年07月31日 10:43:57   作者:樹獺叔叔  
這篇文章主要介紹了一文詳解Golang協(xié)程調度器scheduler,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下

1. 調度器scheduler的作用

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

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

2. GMP模型

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

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

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

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

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

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

    preempt       bool //搶占標記

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

p的數(shù)據(jù)結構如下所示:

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

    // P本地runnable狀態(tài)的G隊列
    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ù)結構如下所示:

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

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

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

} 

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

3. 調度機制

1)work stealing機制

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

2)hand off機制

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

到此這篇關于一文詳解Golang協(xié)程調度器scheduler的文章就介紹到這了,更多相關Golang scheduler內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • golang中context的作用詳解

    golang中context的作用詳解

    這篇文章主要介紹了golang中context的作用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Go 語言中關于接口的三個

    Go 語言中關于接口的三個

    這篇文章主要介紹了Go 語言中關于接口的三個"潛規(guī)則",本文通過實例代碼相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • go?doudou開發(fā)單體RESTful服務快速上手教程

    go?doudou開發(fā)單體RESTful服務快速上手教程

    這篇文章主要為大家介紹了go?doudou開發(fā)單體RESTful服務快速上手教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • go語言面試如何實現(xiàn)自旋鎖?

    go語言面試如何實現(xiàn)自旋鎖?

    這篇文章主要為大家介紹了go語言面試中常問的如何實現(xiàn)自旋鎖問題實例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • go語言多線程操作實現(xiàn)

    go語言多線程操作實現(xiàn)

    多線程是一種使程序能夠并行處理多個任務的技術,Go語言通過goroutine和channel提供了一種相比傳統(tǒng)線程更輕量級、易于管理的并發(fā)實現(xiàn)方式,本文就來介紹一下go語言多線程操作實現(xiàn),感興趣的可以了解一下
    2024-11-11
  • go語言區(qū)塊鏈實戰(zhàn)實現(xiàn)簡單的區(qū)塊與區(qū)塊鏈

    go語言區(qū)塊鏈實戰(zhàn)實現(xiàn)簡單的區(qū)塊與區(qū)塊鏈

    這篇文章主要為大家介紹了go語言區(qū)塊鏈的實戰(zhàn)學習,來實現(xiàn)簡單的區(qū)塊與區(qū)塊鏈示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • Golang中Delve版本太低無法Debug的問題

    Golang中Delve版本太低無法Debug的問題

    這篇文章主要介紹了Golang中Delve版本太低無法Debug的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • go語言通過odbc操作Access數(shù)據(jù)庫的方法

    go語言通過odbc操作Access數(shù)據(jù)庫的方法

    這篇文章主要介紹了go語言通過odbc操作Access數(shù)據(jù)庫的方法,實例分析了Go語言通過odbc連接、查詢與關閉access數(shù)據(jù)庫的技巧,需要的朋友可以參考下
    2015-03-03
  • Golang之模糊測試工具的使用

    Golang之模糊測試工具的使用

    本文主要介紹了Golang之模糊測試工具的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • go rate 原生標準限速庫的使用

    go rate 原生標準限速庫的使用

    本文主要介紹了Go標準庫golang.org/x/time/rate實現(xiàn)限流,采用令牌桶算法控制請求速率,提供Allow/Reserve/Wait方法,具有一定的參考價值,感興趣的可以了解一下
    2025-05-05

最新評論

齐齐哈尔市| 烟台市| 自治县| 左贡县| 娄烦县| 仪陇县| 彭山县| 平陆县| 贵阳市| 章丘市| 苍南县| 万源市| 云和县| 井研县| 连南| 丹棱县| 桐庐县| 南宁市| 武城县| 麻栗坡县| 藁城市| 嘉禾县| 苍南县| 开远市| 英吉沙县| 吉安县| 横山县| 乌拉特中旗| 玉溪市| 清流县| 福建省| 磴口县| 平度市| 宾阳县| 蒙阴县| 吉林市| 电白县| 孟津县| 迁西县| 连江县| 广安市|