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

Go 中的分段棧和連續(xù)棧的區(qū)別?

開發(fā) 后端
如果當(dāng)前 goroutine 的棧幾乎充滿,那么任意的函數(shù)調(diào)用都會(huì)觸發(fā)棧的擴(kuò)容,當(dāng)函數(shù)返回后又會(huì)觸發(fā)棧的收縮,如果在一個(gè)循環(huán)中調(diào)用函數(shù),棧的分配和釋放就會(huì)造成巨大的額外開銷,這被稱為熱分裂問題(Hot split)。

[[429474]]

# 分段棧

在 Go 1.3 版本之前 ,使用的棧結(jié)構(gòu)是分段棧,隨著goroutine 調(diào)用的函數(shù)層級(jí)的深入或者局部變量需要的越來越多時(shí),運(yùn)行時(shí)會(huì)調(diào)用 runtime.morestack 和 runtime.newstack創(chuàng)建一個(gè)新的棧空間,這些棧空間是不連續(xù)的,但是當(dāng)前 goroutine 的多個(gè)棧空間會(huì)以雙向鏈表的形式串聯(lián)起來,運(yùn)行時(shí)會(huì)通過指針找到連續(xù)的棧片段。

分段棧雖然能夠按需為當(dāng)前 goroutine 分配內(nèi)存并且及時(shí)減少內(nèi)存的占用,但是它也存在一個(gè)比較大的問題:

如果當(dāng)前 goroutine 的棧幾乎充滿,那么任意的函數(shù)調(diào)用都會(huì)觸發(fā)棧的擴(kuò)容,當(dāng)函數(shù)返回后又會(huì)觸發(fā)棧的收縮,如果在一個(gè)循環(huán)中調(diào)用函數(shù),棧的分配和釋放就會(huì)造成巨大的額外開銷,這被稱為熱分裂問題(Hot split)。

為了解決這個(gè)問題,Go 在 1.2 版本的時(shí)候不得不將棧的初始化內(nèi)存從 4KB 增大到了 8KB。后來把采用連續(xù)棧結(jié)構(gòu)后,又把初始棧大小減小到了 2KB。

# 連續(xù)棧

連續(xù)棧可以解決分段棧中存在的兩個(gè)問題,其核心原理就是每當(dāng)程序的棧空間不足時(shí),初始化一片比舊棧大兩倍的新棧并將原棧中的所有值都遷移到新的棧中,新的局部變量或者函數(shù)調(diào)用就有了充足的內(nèi)存空間。使用連續(xù)棧機(jī)制時(shí),棧空間不足導(dǎo)致的擴(kuò)容會(huì)經(jīng)歷以下幾個(gè)步驟:

  • 調(diào)用用 runtime.newstack 在內(nèi)存空間中分配更大的棧內(nèi)存空間;
  • 使用 runtime.copystack 將舊棧中的所有內(nèi)容復(fù)制到新的棧中;
  • 將指向舊棧對(duì)應(yīng)變量的指針重新指向新棧;
  • 調(diào)用 runtime.stackfree銷毀并回收舊棧的內(nèi)存空間;

copystack會(huì)把舊棧里的所有內(nèi)容拷貝到新棧里然后調(diào)整所有指向舊棧的變量的指針指向到新棧, 我們可以用下面這個(gè)程序驗(yàn)證下,棧擴(kuò)容后同一個(gè)變量的內(nèi)存地址會(huì)發(fā)生變化。

  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`) 

程序的輸出可以看到在棧擴(kuò)容前后,變量x的內(nèi)存地址的變化:

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

 是不是很簡(jiǎn)單呢?

本文轉(zhuǎn)載自微信公眾號(hào)「Go編程時(shí)光」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Go編程時(shí)光公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: Go編程時(shí)光
相關(guān)推薦

2012-03-29 15:15:49

Java

2009-06-08 22:01:03

Java堆Java棧區(qū)別

2011-07-22 16:50:05

JAVA

2020-05-06 20:40:03

Go編程語(yǔ)言

2014-11-10 10:52:33

Go語(yǔ)言

2021-10-19 09:46:22

ReactGo 技術(shù)

2017-11-22 13:01:03

Go技術(shù)棧構(gòu)建

2018-06-20 10:34:56

堆棧iOSswift

2011-07-22 17:06:22

java

2024-02-02 08:25:34

隊(duì)列與棧Python數(shù)據(jù)結(jié)構(gòu)

2009-09-04 13:43:31

C#順序棧C#連式棧

2010-01-04 20:10:43

MPLS

2009-12-30 15:56:09

MPLS網(wǎng)絡(luò)

2013-05-17 15:38:22

iOS開發(fā)iOS堆棧heap stack

2010-09-08 11:59:38

藍(lán)牙協(xié)議棧

2010-09-08 09:49:28

藍(lán)牙協(xié)議棧

2022-07-06 11:21:11

JHipsterJavaJavaScript

2022-10-08 08:01:07

JVMTLABPLAB

2010-06-17 15:23:38

WAP協(xié)議棧

2021-11-10 15:18:16

JavaGo命令
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 亚洲综合在线一区二区 | 成人国产在线观看 | 久久免费视频在线 | 成人在线观看免费 | 欧美成人一区二免费视频软件 | 国产一级视频 | 久久国内精品 | 亚洲精品在线视频 | 超碰成人免费观看 | 日韩一区二区免费视频 | 男女爱爱网站 | 亚洲国产欧美一区二区三区久久 | 欧美激情久久久 | 三级在线视频 | 日韩久久中文字幕 | 人妖无码 | 91在线网站 | 中文字幕精品视频 | 欧美三级视频在线观看 | 日韩精品a在线观看图片 | 久久狠狠 | 精品久久香蕉国产线看观看亚洲 | 特黄毛片 | 视频一区二区三区中文字幕 | 日韩欧美三区 | 国产精品久久久久久久久久久免费看 | 毛片av免费看 | 午夜a v电影 | 精品国产一区久久 | 久久精品一区二区三区四区 | www.国产日本 | 日韩二区三区 | 欧美一级三级 | 中文视频在线 | 国产电影一区二区在线观看 | 成人亚洲| 国产精品免费一区二区三区四区 | 青娱乐自拍| sese视频在线观看 | 午夜在线视频 | 在线观看毛片网站 |