日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Go語言如何實現(xiàn)stoptheworld?

本文基于 Go 1.13。

創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元麻山做網(wǎng)站,已為上家服務(wù),為麻山各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792

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

停止世界(Stop the world)

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

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

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

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

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

 

goroutine 搶占

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

 

P 標記為已停止

然后,Go 調(diào)度程序?qū)⑦\行,將每個 M 與其 P 各自分離,并將其放入空閑列表中:

 

M 已移至閑置清單

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

 

Goroutine 在全局隊列中等待

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

 

跟蹤 “ STW”階段

系統(tǒng)調(diào)用

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

 
 
 
 
  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 階段,系統(tǒng)調(diào)用正在結(jié)束。但是,由于沒有可用 P(如上一節(jié)所述,它們都被標記為已停止),goroutine 將被放入全局隊列,并在世界恢復(fù)時稍后運行。

延遲時間

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

 
 
 
 
  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 秒:

 

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

相關(guān)鏈接:

  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

文章標題:Go語言如何實現(xiàn)stoptheworld?
網(wǎng)站路徑:http://www.5511xx.com/article/dhpcoes.html