2 回答

TA貢獻1798條經(jīng)驗 獲得超3個贊
"
go
" 語句開始執(zhí)行作為獨立并發(fā)控制線程的函數(shù)調(diào)用,或者goroutine
,在同一地址空間內(nèi)。有人可以向我解釋問題的基本原理嗎?
“地址空間”是一個通用術(shù)語,可應(yīng)用于多種情況:
地址空間是通過組合足夠多的唯一標識限定符來創(chuàng)建的,以使地址明確(在特定地址空間內(nèi))
Dave Cheney的演講“讓 Go 變得更快的五件事”說明了在同一進程地址空間中使用 goroutine 解決的主要問題:堆棧管理。
Dave's 限定了“地址空間”,首先談到線程:
因為進程切換可以在進程執(zhí)行的任何時候發(fā)生,操作系統(tǒng)需要存儲所有這些寄存器的內(nèi)容,因為它不知道當前正在使用哪些寄存器。
這導(dǎo)致了線程的發(fā)展,線程在概念上與進程相同,但共享相同的內(nèi)存空間。
(所以這是關(guān)于內(nèi)存的)
然后 Dave 說明了進程地址空間(由進程管理的地址)內(nèi)的堆棧:
傳統(tǒng)上在進程的地址空間內(nèi),
堆位于內(nèi)存的底部,就在程序(文本)上方并向上增長。
堆棧位于虛擬地址空間的頂部,并向下增長。
另請參閱“堆棧和堆是什么以及在哪里? ”。
問題:
因為堆和棧相互覆蓋將是災(zāi)難性的,操作系統(tǒng)通常會安排在棧和堆之間放置一個不可寫的內(nèi)存區(qū)域,以確保如果它們確實發(fā)生沖突,程序?qū)⒅兄埂?/p>
對于線程,這可能會導(dǎo)致限制進程的堆大小:
隨著程序中線程數(shù)量的增加,可用地址空間的數(shù)量會減少。
goroutine 使用不同的方法,同時仍然共享相同的進程地址空間:
那些 goroutine 的堆棧要求呢?
Go 編譯器不使用保護頁,而是在每個函數(shù)調(diào)用中插入檢查,以檢查是否有足夠的堆棧供函數(shù)運行。如果沒有,運行時可以分配更多的堆??臻g。
由于這種檢查,goroutines 的初始堆棧可以變得更小,這反過來又允許 Go 程序員將 goroutines 視為廉價資源。
Go 1.3 引入了一種管理這些堆棧的新方法:
如果 goroutine 的堆棧太小,將分配一個新的、更大的堆棧,而不是添加和刪除額外的堆棧段。
舊堆棧的內(nèi)容被復(fù)制到新堆棧,然后 goroutine 繼續(xù)使用新的更大的堆棧。
在第一次調(diào)用 H 之后,堆棧將足夠大,因此對可用堆棧空間的檢查將始終成功。

TA貢獻1836條經(jīng)驗 獲得超4個贊
當您的應(yīng)用程序在 RAM 上運行時,RAM 中的地址由內(nèi)存管理器分配給您的應(yīng)用程序。這稱為地址空間。
概念:
處理器 (CPU) 在 Fetch-Decode-Execute 循環(huán)中執(zhí)行指令。它通過將指令提取到 RAM(隨機存取存儲器)來執(zhí)行應(yīng)用程序中的指令。這樣做是因為從磁盤一路獲取它的效率非常低。有人需要跟蹤內(nèi)存使用情況,因此操作系統(tǒng)實現(xiàn)了內(nèi)存管理器。您的應(yīng)用程序由一些程序組成,在您的情況下,這是用 Go 編程語言編寫的。當您執(zhí)行腳本時,操作系統(tǒng)以上述方式執(zhí)行指令。
看了你的帖子,感同身受。隨著程序的增多,你提到的術(shù)語會變得越來越熟悉。
我第一次從操作系統(tǒng)書(又名恐龍書)中遇到這些術(shù)語。
希望這對你有幫助。
- 2 回答
- 0 關(guān)注
- 223 瀏覽
添加回答
舉報