<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          圖解 g0:特殊的 goroutine

          共 2635字,需瀏覽 6分鐘

           ·

          2021-04-28 17:23

          點擊上方藍色“Go語言中文網(wǎng)”關注,每天一起學 Go

          Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.

          ?? 這篇文章基于 Go 1.13。

          在 Go 中創(chuàng)建的所有 Goroutine 都會被一個內(nèi)部的調(diào)度器所管理。Go 調(diào)度器嘗試為所有的 Goroutine 分配運行時間,并且在當前的 Goroutine 阻塞或者終止的時候,Go 調(diào)度器會通過運行 Goroutine 的方式使所有 CPU 保持忙碌狀態(tài)。這個調(diào)度器實際上是作為一個特殊的 Goroutine 運行的。

          調(diào)度 goroutine

          Go 使用 GOMAXPROCS 變量限制同時運行的 OS 線程數(shù)量,這意味著 Go 必須對每個運行著的線程上的 Goroutine 進行調(diào)度和管理。這個調(diào)度的功能被委托給了一個叫做 g0 的特殊的 goroutine, g0 是為每個 OS 線程創(chuàng)建的第一個 goroutine:

          之后,g0 會把就緒狀態(tài)的 Goroutine 調(diào)度到線程上去運行。

          我建議你閱讀我的文章“ Go:Goroutine,OS 線程和 CPU 管理[1]”,來了解更多關于 PM,G 模型的信息。

          為了更好的理解 g0 的調(diào)度策略,來回顧下 channel 的用法。下面是一個 Goroutine 在向 channel 發(fā)送數(shù)據(jù)是阻塞的例子:

          ch := make(chan int)
          [...]
          ch <- v

          當在 channel 上阻塞時,當前的 Goroutine 會被停放( parked ),即處于等待狀態(tài)( waiting mode ),并且不會被放在任何 Goroutine 隊列中:

          之后,g0 會替換 Goroutine 并進行一輪調(diào)度:

          本地隊列在調(diào)度過程中具有優(yōu)先級,2 號 Goroutine 會被運行:

          我建議你閱讀我的文章“ Go: Go 調(diào)度器中的工作竊?。╓ork-Stealing)[2]” 來了解更多關于調(diào)度優(yōu)先級的細節(jié)。

          一旦有接收者讀取 channel 中的數(shù)據(jù),7 號 Goroutine 就會解除阻塞狀態(tài):

          v := <-ch

          收到消息的 Goroutine 會切換到 g0,并且通過放入本地隊列的方式將該 Goroutine 從停放狀態(tài)解鎖:

          雖然這個特殊的 Goroutine 管理調(diào)度策略,但這并不是它唯一的工作,它還負責著更多的工作。

          職責

          與普通 Goroutine 不同的是,g0 有著固定且更大的棧,這使得在需要更大的棧的時候,以及棧不宜增長的時候,Go 可以進行操作。在 g0 的職責中,我們可以列出:

          • Goroutine 創(chuàng)建。當調(diào)用 go func(){ ... }()go myFunction() 時,Go 會在把它們放入本地隊列前,將函數(shù)的創(chuàng)建委托給 g0 去做:

          新創(chuàng)建的 Goroutine 優(yōu)先運行,并且被放在本地隊列的頂部。

          建議閱讀我的文章“Go:并發(fā)與調(diào)度器親和性( Go: Concurrency & Scheduler Affinity )[3]”了解更多關于 Goroutine 優(yōu)先級的信息。

          • defer 函數(shù)分配。
          • 垃圾收集操作,比如 STW( stopping the world ),掃描 Goroutine 的棧,以及一些標記清理操作。
          • 棧增長。當需要的時候,Go 會增加 Goroutine 的大小。這個操作是由 g0 的 prolog 函數(shù)完成的。

          這個特殊的 Goroutine 涉及許多其他操作(較大空間的對象分配,cgo 等),需要較大的棧來保證我們的程序進行更高效的管理操作,以保持程序的低內(nèi)存打印效率。


          via: https://medium.com/a-journey-with-go/go-g0-special-goroutine-8c778c6704d8

          作者:Vincent Blanchon[4]譯者:dust347[5]校對:polaris1119[6]

          本文由 GCTT[7] 原創(chuàng)編譯,Go 中文網(wǎng)[8] 榮譽推出

          參考資料

          [1]

          Go:Goroutine,OS 線程和 CPU 管理: https://medium.com/a-journey-with-go/go-goroutine-os-thread-and-cpu-management-2f5a5eaf518a

          [2]

          Go: Go 調(diào)度器中的工作竊取(Work-Stealing): https://medium.com/a-journey-with-go/go-work-stealing-in-go-scheduler-d439231be64d

          [3]

          Go:并發(fā)與調(diào)度器親和性( Go: Concurrency & Scheduler Affinity ): https://medium.com/a-journey-with-go/go-concurrency-scheduler-affinity-3b678f490488

          [4]

          Vincent Blanchon: https://medium.com/@blanchon.vincent

          [5]

          dust347: https://github.com/dust347

          [6]

          polaris1119: https://github.com/polaris1119

          [7]

          GCTT: https://github.com/studygolang/GCTT

          [8]

          Go 中文網(wǎng): https://studygolang.com/



          推薦閱讀


          福利

          我為大家整理了一份從入門到進階的Go學習資料禮包,包含學習建議:入門看什么,進階看什么。關注公眾號 「polarisxu」,回復 ebook 獲取;還可以回復「進群」,和數(shù)萬 Gopher 交流學習。


          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大鸡吧精品网 | 久久人兽 | 操逼网站。| 操操女人的逼 | www色色五月天 |