日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【翻译】为什么 goroutine 的栈内存无穷大?

發布時間:2025/7/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【翻译】为什么 goroutine 的栈内存无穷大? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

一些 Go 語言的新學習者總是會對 goroutine 棧內存占用大小感到非常好奇。這一般是由于程序員進行無限的函數循環調用導致的。為了說明這個問題,請思考以下代碼示例(為使問題更加清晰而使用相對刻意的寫法):

package mainimport "fmt"type S struct {a, b int }// String 實現了接口 fmt.Stringer func (s *S) String() string {return fmt.Sprintf("%s", s) // 調用 Sprintf 時會默認調用 s.String() }func main() {s := &S{a: 1, b: 2}fmt.Println(s) }

盡管我不建議你這樣做,但當你嘗試運行這段代碼的時候,你會發現你的機器正在進行大量的運算,甚至變得無響應而使你不得不使用 ctrl + c 來中斷執行,以免程序最終達到無藥可救的地步;因為我知道你會這樣做,所以我為你做好了這一步,你可以直接在 playground 執行這段代碼。

許多程序員都曾經寫過類似的代碼而導致函數的無限循環調用,并使得他們的程序崩潰,但一般情況下并不足以對他們的機器造成毀滅性破壞。問題是,為什么 Go 的程序就特殊一點的呢?

goroutine 的一個主要特性就是它們的消耗;創建它們的初始內存成本很低廉(與需要 1 至?8MB 內存的傳統 POSIX?線程形成鮮明對比)以及根據需要動態增長和縮減占用的資源。這使得 goroutine 會從 4096 字節的初始棧內存占用開始按需增長或縮減內存占用,而無需擔心資源的耗盡。

為了實現這個目標,鏈接器(5l、6l 和 8l)會在每個函數前插入一個序文,這個序文會在函數被調用之前檢查判斷當前的資源是否滿足調用該函數的需求(備注 1)。如果不滿足,則調用 runtime.morestack 來分配新的棧頁面(備注 2),從函數的調用者那里拷貝函數的參數,然后將控制權返回給調用者。此時,已經可以安全地調用該函數了。當函數執行完畢,事情并沒有就此結束,函數的返回參數又被拷貝至調用者的棧結構中,然后釋放無用的棧空間。

通過這個過程,有效地實現了棧內存的無限使用。假設你并不是不斷地在兩個棧之間往返,通俗地講叫棧分割,則代價是十分低廉的。

但是我一直注意到一個問題,當你的程序存在函數的無限循環調用而即將導致你的操作系統內存枯竭,而此時又恰好需要分配新的棧頁面,則會從堆中分配內存。

當你的函數無止盡地調用著自己,新的棧頁面會不斷地從堆中分配,繼而使得函數又能夠繼續調用自己。我相信這很快就會使程序用光你機器所有空余的物理內存,交換存儲器也會被大量使用,最終導致你的系統變得非常不穩定。

可以被 Go 使用的堆內存取決于許多方面,包括你的 CPU 架構以及操作系統,但一般依賴于你機器可用的物理內存,因此你的機器會在即將使用完堆內存之前進行大量交換存儲器的操作。

對于 Go 1.1,許多人都希望可以提升 32 位以及 64 位平臺上堆內存使用的最大限制,這個問題會在某些情況下變得更加嚴重。比如說,你的機器不太可能擁有 128GB 的物理內存(備注 3)。

最后要說的是,這里有一些 issue 已經涉及到這個問題(issue1、issue2),但仍未找到在不損失性能的情況下能夠處理該問題的一個好的解決方案。

備注:
1. 同樣適用于方法,但方法的接收者本質上就是函數的第一個參數,當討論有關 Go 的分段棧的問題時,沒有必要將它們區別對待。
2. 使用頁面這個詞不代表每次分配的內存額度是固定的 4096 字節,必要時會調用 runtime.morestack 來進行新的分配,但我猜測會與頁面值的倍數相接近。
3. 由于 Go 1.1 的改動,64 位 Windows 平臺的堆內存被限制在 32GB 之內。

原文地址:http://dave.cheney.net/2013/06/02/why-is-a-goroutines-stack-infinite

?

轉載于:https://my.oschina.net/Obahua/blog/144549

總結

以上是生活随笔為你收集整理的【翻译】为什么 goroutine 的栈内存无穷大?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美女国产一区 | 新x8x8拨牐拨牐永久免费影库 | 精品日韩在线 | 国产福利91精品 | 国产熟女一区二区三区五月婷 | 国产精品扒开腿做爽爽 | x88av视频| 亚洲AV成人无码一二三区在线 | 女生脱裤子让男生捅 | 国产精品一区二区免费在线观看 | 免费看毛片网站 | 美女啪啪免费视频 | 怡春院视频 | 热热色国产 | 国产精品美女www爽爽爽视频 | 国产成人无码一区二区在线播放 | 国产无套在线观看 | 福利片一区二区 | 亚洲成人国产 | 欧美成人猛片aaaaaaa | 国产一区二区日韩 | 亚洲精品久久久久久 | 日韩欧美中文字幕一区二区 | 激情文学综合网 | 久久久国产精品人人片 | 亚洲成年人| 一本一道久久综合狠狠老精东影业 | 色久阁| 精品夜夜澡人妻无码av | 97人人爽人人爽人人爽人人爽 | 在线视频播放大全 | 动漫大乳美女 | 亚洲成av人片在线观看无码 | wwww欧美| 高清乱码免费看污 | 高清国产mv在线观看 | 91国内在线视频 | 18我禁在线观看 | 日韩精品一区二区三区中文字幕 | 大地资源中文第三页 | 国产91成人 | 成人夜色视频 | 99热18 | 精品久久久蜜桃 | 6080av| 亚洲在线观看一区二区 | 成人午夜天 | 午夜小视频在线 | 色播放 | 国产内射一区二区 | 亚洲性视频网站 | 夜夜爽妓女8888视频免费观看 | 国产久草视频 | 好吊操这里有精品 | 午夜性 | 欧美成人日韩 | 欧美日韩国产a | 日韩高清久久 | 国产精品丝袜视频 | 久久久久久天堂 | 亚洲成人av综合 | av影院在线观看 | 中文字幕一区二区三区电影 | 特黄一级大片 | 尤物国产在线 | 一级黄色短视频 | 中文字幕第二页 | 人妻av无码一区二区三区 | 丰满岳跪趴高撅肥臀尤物在线观看 | 观看av免费 | 国产极品美女高潮无套嗷嗷叫酒店 | 国产富婆一级全黄大片 | 午夜黄色福利 | 国产高清中文字幕 | 欧洲精品视频在线 | 亚洲国产精品无码专区 | 色七七在线| 国产在线拍 | 成年人在线播放视频 | www.日日干| 日韩一区二区不卡视频 | 天天操夜夜草 | av在线播放器 | 国产高清小视频 | 国产黄在线免费观看 | 成人欧美一区二区三区白人 | 成人app在线 | 四虎首页| 成人一区二区三区仙踪林 | 久久久久极品 | 国产欧美精品一区二区三区app | 91黑人精品一区二区三区 | 91免费短视频| 精品福利视频一区二区 | 国产精品乱码一区二三区小蝌蚪 | 亚洲一区二区三区av无码 | 97av在线视频| 久久免费av | 操操操爽爽爽 |