成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

曹大帶我學 Go之一調度的本質

開發 后端
熟悉 GMP 模型的朋友都知道,goroutine 最終在 m 上得以執行,因為操作系統感知不到 goroutine,它只能感知線程,并且線程可以看成是 m。

[[400606]]

你好,我是小X。

曹大最近開 Go 課程了,小X 正在和曹大學 Go。

這個系列會講一些從課程中學到的讓人醍醐灌頂的東西,撥云見日,帶你重新認識 Go。

上周課程已經開始了,曹大直播了第一期,干貨滿滿,大呼過癮。第一課之后,陸續又加進來了一些同學。

首先拋出本文的結論:Go 調度的本質是一個生產-消費流程。

生產者-消費者

生產者-消費者模型

我們平時用 Go 最爽的一點莫過于用一句 go func(){}() 就啟動了一個 goroutine 來并發地執行任務。這比用 C/C++ 啟動一個線程并發地去執行任務方便太多。這句代碼實際上就生產出了一個 goroutine,并進入可運行隊列,等待和 m 來找它從而可以得到運行。

熟悉 GMP 模型的朋友都知道,goroutine 最終在 m 上得以執行,因為操作系統感知不到 goroutine,它只能感知線程,并且線程可以看成是 m。

所以,m 拿到 goroutine 并運行它的過程就是一個消費過程。

生產-消費過程

生產過程——三級隊列

生產出的 goroutine 需要找一個地方存放,這個地方就是可運行隊列。在 Go 程序中,可運行隊列是分級的,分為三級:

三級可運行隊列

runnext 實際上只能指向一個 goroutine,所以它是一個特殊的隊列。

那把 goroutine 放到哪個可運行隊列呢?看情況。

首先,如果 runnext 為空,那么 goroutine 就會順利地放入 runnext,接下來,它會以最高優先級得到運行,即優先被消費。

如果 runnext 不為空,那就先負責把 runnext 上的 old goroutine 踢走,再把 new goroutine 放上來。具體踢到哪里呢?又得分情況。

local queue 是一個大小為 256 的數組,實際上用 head 和 tail 指針把它當成一個環形數組在使用。如果 local queue 不滿,則將 runnext 放入 local queue;否則,P 的本地隊列上的 goroutine 太多了,說明當前 P 的任務太重了,需要減負,因此需要得到其他 P 協助。從而,將 runnext 以及當前 P 的一半 goroutine 一起打包丟到 global queue 里去。

當然,這部分課程里有非常生動的動畫,這里貼一個截圖大家感受一下:

生產者動畫

消費過程——調度循環

之前的文章里也講到過調度循環是咋回事,它實際上就是 Go 程序在啟動的時候,會創建和 CPU 核心數相等個數的 P,會創建初始的 m,稱為 m0。這個 m0 會啟動一個調度循環:不斷地找 g,執行,再找 g……

偽代碼是這樣的:

調度循環

隨著程序的運行,m 更多地被創建出來,因此會有更多的調度循環在執行。

那邊生產者在不斷地生產 g,這邊 m 的調度循環不斷地在消費 g,整個過程就 run 起來了。

找 g 的過程中當然也是從上面的三級隊列里找:

先看 runnext,再看 local queue,再看 global queue。當然,如果實在找不到,就去其他 p 去偷。

總結

今天的文章只用記住一個觀點:Go 調度的本質是一個生產-消費流程。這個觀點非常新穎,之前我沒有從哪篇文章看到過,這是曹大自己的感悟。

讀者即使之前沒見過類似的說法,但是一旦聽曹大講出來,就馬上感覺醍醐灌頂。

 

這種熟悉加意外的效果其實就是你成長的時機。

 

責任編輯:武曉燕 來源: 碼農桃花源
相關推薦

2021-06-10 09:00:32

Go底層代碼

2021-06-07 10:47:02

GoGoexit函數

2021-06-01 09:27:53

Ast Go語言

2022-01-05 08:56:20

Go火焰圖編程

2021-08-09 07:47:39

ExtraGoMap

2021-07-15 08:58:15

指定配置項Go

2021-05-27 08:59:09

Go匯編命令

2024-12-03 15:15:22

2013-01-09 17:57:11

曹開彬

2013-07-02 11:14:40

SCE虛擬化

2022-12-14 23:05:29

Go模糊測試

2022-11-27 23:37:34

Go模式Workspaces

2020-11-11 08:20:33

比特幣加密貨幣區塊鏈

2021-10-19 11:22:08

SentinelGo源碼

2014-07-31 10:57:15

Android組件Service

2021-09-26 05:05:46

GoFiber Express

2016-12-01 14:16:18

GitSCM配置

2018-11-12 08:04:15

2018-12-03 05:06:53

2018-11-16 17:00:05

Python腳本數據分析
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品成人 | 久久黄色精品视频 | 亚洲av毛片成人精品 | www.五月天婷婷.com | 91热在线| 二区中文 | 亚洲一区二区电影网 | 美女视频网站久久 | 91国自视频 | 欧美激情一区 | 91视频网 | 怡红院免费的全部视频 | 成人精品视频 | 久久精品国产一区 | 蜜臀网| 一区二区在线 | 日本在线视频不卡 | 伊人久久麻豆 | 国产国拍亚洲精品av | 久久爱黑人激情av摘花 | 亚洲色图网址 | 中文在线一区二区 | 亚洲国产精品视频 | 成人欧美日韩一区二区三区 | 欧美精品一区二区三区在线播放 | www.99精品| 久久国产精品一区二区三区 | 亚洲一区二区在线播放 | 久久国产精品精品国产色婷婷 | 特级生活片 | 国内精品久久久久久 | 久久成人av电影 | av色站 | 欧美片网站免费 | ririsao久久精品一区 | 99久久精品国产一区二区三区 | 一级欧美 | 在线一级片 | 欧美国产一区二区 | 懂色一区二区三区免费观看 | 日韩毛片在线免费观看 |