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

Go語言如何實現stop the world?

開發 后端
在某些垃圾回收器算法中,“停止世界”(Stop the World: STW,下同)是跟蹤內存使用最重要的階段,它會停止程序的執行,以掃描內存使用,并添加寫障礙。讓我們回顧一下它在內部如何工作,以及它可能面臨的潛在問題。

 [[318932]]

本文基于 Go 1.13。

在某些垃圾回收器算法中,“停止世界”(Stop the World: STW,下同)是跟蹤內存使用最重要的階段,它會停止程序的執行,以掃描內存使用,并添加寫障礙。讓我們回顧一下它在內部如何工作,以及它可能面臨的潛在問題。

停止世界(Stop the world)

停止程序意味著停止所有正在運行的 goroutine。下面是一個執行 STW 的簡單程序:

 

  1. func main() { 
  2.    runtime.GC() 

運行垃圾回收器,將觸發 STW 兩個階段。

有關垃圾回收器周期的更多信息,建議閱讀我的另外一篇文章 “Go:垃圾收集器如何標記內存? ① ”

第一步:搶占所有正在運行的 goroutine:

 

 

 

 

goroutine 搶占

一旦 goroutine 被搶占,它們將在安全點停止。同時,P 處理器將(正在運行的代碼或在空閑列表)被標記為已停止,以不運行任何代碼:

 

 

 

 

P 標記為已停止

然后,Go 調度程序將運行,將每個 M 與其 P 各自分離,并將其放入空閑列表中:

 

 

 

 

M 已移至閑置清單

關于在每個上運行的 goroutine M,它們將在全局隊列中等待:

 

 

 

 

Goroutine 在全局隊列中等待

然后,一旦世界停止了,只有唯一活動的 goroutine 才能安全地運行,并在工作完成后啟動整個世界。下面跟蹤圖將有助于理解此階段發生在何時:

 

 

 

 

跟蹤 “ STW”階段

系統調用

“STW”階段也可能會影響系統調用,因為它們可能會在 STW 時返回。讓我們以一個密集執行系統調用的例子,并查看其如何處理:

 

  1. func main() { 
  2.    var wg sync.WaitGroup 
  3.    wg.Add(10) 
  4.    for i := 0; i < 10; i++ { 
  5.       go func() { 
  6.          http.Get(`https://httpstat.us/200`) 
  7.          wg.Done() 
  8.       }() 
  9.    } 
  10.    wg.Wait() 

這是跟蹤:

 

 

 

 

STW 階段,系統調用正在結束。但是,由于沒有可用 P(如上一節所述,它們都被標記為已停止),goroutine 將被放入全局隊列,并在世界恢復時稍后運行。

延遲時間

“STW” 第三步涉及將所有 M 與其 P 分離。但是,Go 將等待它們自行停止:在調度程序運行時,在 syscall 調用中等。等待 goroutine 被搶占應該很快,但是在某些情況下,可能會導致某些延遲。讓我們以一個極端的情況為例:

 

  1. func main() { 
  2.    var t int 
  3.    for i := 0;i < 20 ;i++  { 
  4.       go func() { 
  5.          for i := 0;i < 1000000000 ;i++ { 
  6.             t++ 
  7.          } 
  8.       }() 
  9.    } 
  10.  
  11.    runtime.GC() 

在這里,“ Stop the World”階段需要 2.6 秒:

 

 

 

 

沒有函數調用的 goroutine 將不會被搶占,并且 P 在任務結束之前不會被釋放。這將迫使“STW”等待。有幾種解決方案可改善循環中的搶占,有關此方面的更多信息,建議閱讀我另外一篇文章“ Go:Goroutine和搶占 ②”。

相關鏈接:

  1. https://medium.com/a-journey-with-go/go-how-does-the-garbage-collector-mark-the-memory-72cfc12c6976
  2. https://medium.com/a-journey-with-go/go-goroutine-and-preemption-d6bc2aa2f4b7

 

責任編輯:武曉燕 來源: 高可用架構
相關推薦

2021-08-10 07:27:42

Python引用計數法

2017-11-16 15:25:54

Go語言算法代碼

2024-04-26 09:04:13

2023-04-18 08:27:16

日志級別日志包

2022-11-10 07:43:45

2022-10-26 07:26:38

2024-11-12 10:09:59

Go語言第三方庫

2015-09-16 17:30:20

安裝Go語言Linux

2023-05-19 08:01:57

Go 語言map

2018-03-12 22:13:46

GO語言編程軟件

2022-05-09 10:36:05

PythonPyScript開發者

2022-11-01 18:29:25

Go語言排序算法

2024-02-06 17:57:06

Go語言任務

2020-08-12 08:56:30

代碼凱撒密碼函數

2023-05-08 07:55:05

快速排序Go 語言

2024-08-29 13:23:04

WindowsGo語言

2024-04-11 13:13:27

2023-04-03 08:02:16

切片擴容GO

2019-01-02 13:11:53

GO語言緩存

2014-04-24 10:48:27

Go語言基礎實現
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产高清免费 | 欧美日韩不卡 | 国产精品99| 精品一区二区三区在线观看 | 理论片免费在线观看 | 国产精品美女久久久久aⅴ国产馆 | 91精品一区二区三区久久久久 | 精品欧美一区免费观看α√ | 91免费在线视频 | 一区在线视频 | 色爱综合网 | 毛片一级片 | 日日夜夜天天久久 | 一区在线观看视频 | 久久精品欧美一区二区三区不卡 | 亚洲va在线va天堂va狼色在线 | 91在线视频观看免费 | 国产精品久久久久久久久久久久午夜片 | 欧美一区二区三区视频在线观看 | 欧美成年人 | 国产精品一区久久久 | 亚洲一区二区三区四区在线观看 | 国产资源在线观看 | 欧美精品中文字幕久久二区 | 黑人精品欧美一区二区蜜桃 | 亚洲品质自拍视频网站 | 麻豆国产一区二区三区四区 | 99久久免费精品 | 日韩成人影院 | 中文字幕第5页 | 天天玩天天干天天操 | 欧美二区在线 | 日韩av一区二区在线观看 | 亚洲3p | 中文字字幕一区二区三区四区五区 | 亚洲一区二区三区四区五区午夜 | 米奇成人网 | 亚洲自拍一区在线观看 | 欧美一级www片免费观看 | 国产精品我不卡 | 成人午夜视频在线观看 |