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

Go 中的分段棧和連續棧的區別?

開發 后端
如果當前 goroutine 的棧幾乎充滿,那么任意的函數調用都會觸發棧的擴容,當函數返回后又會觸發棧的收縮,如果在一個循環中調用函數,棧的分配和釋放就會造成巨大的額外開銷,這被稱為熱分裂問題(Hot split)。

[[429474]]

# 分段棧

在 Go 1.3 版本之前 ,使用的棧結構是分段棧,隨著goroutine 調用的函數層級的深入或者局部變量需要的越來越多時,運行時會調用 runtime.morestack 和 runtime.newstack創建一個新的棧空間,這些棧空間是不連續的,但是當前 goroutine 的多個棧空間會以雙向鏈表的形式串聯起來,運行時會通過指針找到連續的棧片段。

分段棧雖然能夠按需為當前 goroutine 分配內存并且及時減少內存的占用,但是它也存在一個比較大的問題:

如果當前 goroutine 的棧幾乎充滿,那么任意的函數調用都會觸發棧的擴容,當函數返回后又會觸發棧的收縮,如果在一個循環中調用函數,棧的分配和釋放就會造成巨大的額外開銷,這被稱為熱分裂問題(Hot split)。

為了解決這個問題,Go 在 1.2 版本的時候不得不將棧的初始化內存從 4KB 增大到了 8KB。后來把采用連續棧結構后,又把初始棧大小減小到了 2KB。

# 連續棧

連續棧可以解決分段棧中存在的兩個問題,其核心原理就是每當程序的棧空間不足時,初始化一片比舊棧大兩倍的新棧并將原棧中的所有值都遷移到新的棧中,新的局部變量或者函數調用就有了充足的內存空間。使用連續棧機制時,棧空間不足導致的擴容會經歷以下幾個步驟:

  • 調用用 runtime.newstack 在內存空間中分配更大的棧內存空間;
  • 使用 runtime.copystack 將舊棧中的所有內容復制到新的棧中;
  • 將指向舊棧對應變量的指針重新指向新棧;
  • 調用 runtime.stackfree銷毀并回收舊棧的內存空間;

copystack會把舊棧里的所有內容拷貝到新棧里然后調整所有指向舊棧的變量的指針指向到新棧, 我們可以用下面這個程序驗證下,棧擴容后同一個變量的內存地址會發生變化。

  1. package main 
  2.  
  3. func main() { 
  4.     var x [10]int 
  5.     println(&x) 
  6.     a(x) 
  7.     println(&x) 
  8.  
  9. //go:noinline 
  10. func a(x [10]int) { 
  11.     println(`func a`) 
  12.     var y [100]int 
  13.     b(y) 
  14.  
  15. //go:noinline 
  16. func b(x [100]int) { 
  17.     println(`func b`) 
  18.     var y [1000]int 
  19.     c(y) 
  20.  
  21. //go:noinline 
  22. func c(x [1000]int) { 
  23.     println(`func c`) 

程序的輸出可以看到在棧擴容前后,變量x的內存地址的變化:

  1. 0xc000030738 
  2. ... 
  3. ... 
  4. 0xc000081f38 

 是不是很簡單呢?

本文轉載自微信公眾號「Go編程時光」,可以通過以下二維碼關注。轉載本文請聯系Go編程時光公眾號。

 

責任編輯:武曉燕 來源: Go編程時光
相關推薦

2012-03-29 15:15:49

Java

2009-06-08 22:01:03

Java堆Java棧區別

2011-07-22 16:50:05

JAVA

2020-05-06 20:40:03

Go編程語言

2021-10-19 09:46:22

ReactGo 技術

2017-11-22 13:01:03

Go技術棧構建

2014-11-10 10:52:33

Go語言

2018-06-20 10:34:56

堆棧iOSswift

2011-07-22 17:06:22

java

2024-02-02 08:25:34

隊列與棧Python數據結構

2009-09-04 13:43:31

C#順序棧C#連式棧

2009-12-30 15:56:09

MPLS網絡

2010-01-04 20:10:43

MPLS

2022-07-06 11:21:11

JHipsterJavaJavaScript

2013-05-17 15:38:22

iOS開發iOS堆棧heap stack

2010-09-08 09:49:28

藍牙協議棧

2010-09-08 11:59:38

藍牙協議棧

2021-11-10 15:18:16

JavaGo命令

2022-10-08 08:01:07

JVMTLABPLAB

2010-06-17 15:23:38

WAP協議棧
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩区 | 91国内外精品自在线播放 | 97在线播放 | 国产精品久久久久久婷婷天堂 | 夜夜爽99久久国产综合精品女不卡 | 在线观看亚洲专区 | 亚洲网站在线观看 | 黄色精品 | 日本不卡视频 | 日韩色视频 | 大香在线伊779 | 1区2区3区视频 | 成人在线播放网址 | 亚洲午夜精品一区二区三区他趣 | 国产精品一区二区电影 | 久久与欧美 | 午夜日韩| 中文字幕11页| 亚洲精品黄 | 一级毛片免费 | 欧美精品一区二区在线观看 | 欧美一级黄带 | 成年人视频免费在线观看 | 欧美成人精品激情在线观看 | 欧洲亚洲一区二区三区 | 99热播精品| 久久免费看 | 亚洲欧美日韩国产 | 嫩草视频在线看 | 一区二区三区av | 日韩精品视频在线 | 日韩欧美在线播放 | 一级做a爰片性色毛片视频停止 | 亚洲综合字幕 | 国产农村妇女毛片精品久久麻豆 | 国产精品中文字幕在线播放 | 中文字幕精品一区久久久久 | 欧美大片一区二区 | 伊人春色成人网 | 亚洲国产一区二区视频 | 91国产视频在线 |