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

Go調(diào)度器: M,P和G

開發(fā)
這是另一篇關(guān)于Go調(diào)度器(scheduler)的文章。 原文: GO SCHEDULER: MS, PS & GS by Uber工程師 Povilas。

這是另一篇關(guān)于Go調(diào)度器(scheduler)的文章。 原文: GO SCHEDULER: MS, PS & GS by Uber工程師 Povilas。

網(wǎng)上已經(jīng)有很多關(guān)于Go調(diào)度器的文章了, 比如 Golang調(diào)度器源碼分析 ,多看一些,可以加深記憶,也可以對比查看文章中是否有不準(zhǔn)確的地方,更全面的了解Go的調(diào)度器。

我決定深入了解Go的內(nèi)部機制, 因為很長時間沒人寫關(guān)于Go scheduler的文章了, 我覺得這是一個很有趣的知識點,所以讓我們開始吧。

基礎(chǔ)知識

Go的運行時管理著調(diào)度、垃圾回收以及goroutine的運行環(huán)境。本文只關(guān)注于調(diào)度器。

運行時負(fù)責(zé)運行g(shù)oroutine并把它們影射到操作系統(tǒng)的線程上。goroutine比線程還輕量, 啟動的時候花費很少。每個goroutine都是由一個 G 結(jié)構(gòu)來表示,

這個結(jié)構(gòu)體的字段用來跟蹤此goroutine的棧(stack)和狀態(tài),所以你可以認(rèn)為 G = goroutine 。

運行時管理著 G 并把它們映射到 Logical Processor (稱之為 P ). P 可以看作是一個抽象的資源或者一個上下文,它需要獲取以便操作系統(tǒng)線程(稱之為 M )可以運行 G 。

通過 runtime.GOMAXPROCS (numLogicalProcessors) 可以控制多少 P 可以獲取。如果你需要調(diào)整這個參數(shù)(大部分情況下你無需調(diào)整), 只設(shè)置一次, 因為它需要 STW gc pause。

本質(zhì)上,操作系統(tǒng)運行線程,線程運行你的代碼。Go的技巧是編譯器會在Go運行時的一些地方插入系統(tǒng)調(diào)用, (比如通過channel發(fā)送值,調(diào)用runtime包等),所以Go可以通知調(diào)度器執(zhí)行特定的操作。

Go調(diào)度器: M,P和G

上圖的理解來自 Analysis of the Go runtime scheduler

M、P 和 G 之間的交互

M、 P 和 G 之間的交互有點復(fù)雜。看看下面這張來自 Gao Chao的 go runtime scheduler 幻燈片中的一張圖:

Go調(diào)度器: M,P和G

可以看到,Go運行時存在兩種類型的queue: 一種是一個全局的queue(在 schedt結(jié)構(gòu)體中 ,很少用到), 一種是每個 P 都維護自己的 G 的queue。

為了運行g(shù)oroutine, M 需要持有上下文 P 。 M 會從 P 的queue彈出一個goroutine并執(zhí)行。

當(dāng)你創(chuàng)建一個新的goroutine的時候( go func() 方法),它會被放入 P 的queue。當(dāng)然還有一個 work-stealing 調(diào)度算法,當(dāng) M 執(zhí)行了一些 G 后,如果它的queue為空,它會隨機的選擇另外一個 P ,從它的queue中取走一半的 G 到自己的queue中執(zhí)行。(偷!)

當(dāng)你的goroutine執(zhí)行阻塞的系統(tǒng)調(diào)用的時候(syscall),阻塞的系統(tǒng)調(diào)用會中斷(intercepted),如果當(dāng)前有一些 G 在執(zhí)行,運行時會把這個線程從 P 中摘除(detach),然后再創(chuàng)建一個新的操作系統(tǒng)的線程(如果沒有空閑的線程可用的話)來服務(wù)于這個 P 。

當(dāng)系統(tǒng)調(diào)用繼續(xù)的時候,這個goroutine被放入到本地運行queue,線程會 park 它自己(休眠), 加入到空閑線程中。

如果一個goroutine執(zhí)行網(wǎng)絡(luò)調(diào)用,運行時會做類似的動作。調(diào)用會被中斷,但是由于Go使用集成的network poller,它有自己的線程,所以還給它。

Go運行時會在下面的goroutine被阻塞的情況下運行另外一個goroutine:

  • blocking syscall (for example opening a file),
  • network input,
  • channel operations,
  • primitives in the sync package.

調(diào)度器跟蹤調(diào)試

Go可以跟蹤運行時的調(diào)度器,這是通過 GODEBUG 環(huán)境變量實現(xiàn)的:

  1. $ GODEBUG=scheddetail=1,schedtrace=1000 ./program 

下面是輸出的例子:

 

  1. SCHED 0ms: gomaxprocs=8 idleprocs=7 threads=2 spinningthreads=0 idlethreads=0 runqueue=0 gcwaiting=0 nmidlelocked=0 stopwait=0 sysmonwait=0 
  2.   P0: status=1 schedtick=0 syscalltick=0 m=0 runqsize=0 gfreecnt=0 
  3.   P1: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0 
  4.   P2: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0 
  5.   P3: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0 
  6.   P4: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0 
  7.   P5: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0 
  8.   P6: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0 
  9.   P7: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0 
  10.   M1: p=-1 curg=-1 mallocing=0 throwing=0 preemptoff= locks=1 dying=0 helpgc=0 spinning=false blocked=false lockedg=-1 
  11.   M0: p=0 curg=1 mallocing=0 throwing=0 preemptoff= locks=1 dying=0 helpgc=0 spinning=false blocked=false lockedg=1 
  12.   G1: status=8() m=0 lockedm=0 

注意輸出使用了 G 、 M 和 P 的概念以及她們的狀態(tài), 比如 P 的queue的大小。 如果你不想關(guān)心這些細(xì)節(jié),你可以使用:

  1. $ GODEBUG=schedtrace=1000 ./program 

William Kennedy寫了一篇很好的 文章 , 解釋了這些細(xì)節(jié)。

當(dāng)然,還有一個go自己的工具 go tool trace , 它有一個UI, 允許你查看你的程序和運行時的狀況。你可以閱讀這篇文章: Pusher 。

責(zé)任編輯:未麗燕 來源: colobu bolg
相關(guān)推薦

2023-12-18 09:31:35

Go容器Linux

2023-10-25 12:51:28

Go調(diào)度器

2021-04-13 08:56:13

Go啟動流程

2025-01-15 09:13:53

2009-06-09 10:34:41

802.16mLTE4G

2025-07-03 00:28:41

2024-12-03 15:15:22

2021-10-26 07:42:49

Go線程數(shù)GMP

2020-10-13 09:23:57

LinuxKernel調(diào)度器

2011-01-21 07:36:00

LinuxBFSCFS

2025-07-04 08:43:51

2021-08-22 17:18:58

Go代碼泛型代碼

2023-11-07 07:56:40

2010-09-01 15:10:46

無線局域網(wǎng)Super G

2020-10-12 08:32:34

瀏覽器進程線程

2011-01-13 13:59:14

2023-04-17 08:13:13

KubernetesPod

2023-11-20 22:55:00

Goroutine調(diào)度器

2021-01-29 08:22:03

調(diào)度器Yarn架構(gòu)

2011-09-05 13:27:00

P2PTP-LINK路由器限
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美理伦片在线播放 | 久草在线 | 午夜视频一区二区 | 国产aaaaav久久久一区二区 | 国产一区二区三区免费观看在线 | 亚洲高清视频一区二区 | 亚洲免费视频一区 | 狠狠干天天干 | 亚洲一区二区三区四区在线观看 | 国产高清精品一区二区三区 | 亚洲天堂一区二区 | 在线超碰 | 欧美日日 | 欧美黑人激情 | 国产视频第一页 | 亚洲欧美一区二区三区视频 | 99热电影| 999久久久久久久久6666 | 中文字幕一区二区三区精彩视频 | 天天插天天干 | 久久精品这里 | 香蕉视频黄色 | 美女亚洲一区 | 日韩成年人视频在线 | 国产一区二区三区四区三区四 | 性国产丰满麻豆videosex | 久久久人成影片一区二区三区 | 久久久www成人免费精品 | 91国内视频在线 | 久久亚洲欧美日韩精品专区 | 热久久免费视频 | 欧美色综合一区二区三区 | 欧美日韩一二区 | 九九热在线视频观看这里只有精品 | 999精品在线 | 伊人网91 | 午夜在线| 欧美成人h版在线观看 | 伊人免费在线 | 国产伦精品一区二区 | 中国av在线免费观看 |