Go COSCUP COSCUP 2020 - Goroutine stack and local variable allocation in Go

Q&A 補充

Slides: Goroutine stack and local variable allocation in Go

這次分享中,有人詢問我在 stack growing 的時候, user stack 和 system stack 是如何交替切換的。由於當時沒有仔細看 switch 流程,無法很清楚地答覆他,所以事後又看了一下這段,並且畫出簡圖:

hugo

首先,在 curg (current goroutine) func1 呼叫 func2 後,發現 user stack 空間不足,此時先儲存 func1 的 state 到 M 的 morebuf struct 中(用來 bug tracing),接著把 func2 的 state (就是當前 goroutine 的執行狀態,包含 stack pointer, program counter 等)存在 curg 的 sched struct 中,接著 switch 到 g0,從 g0 的 sched 取出 stack pointer 的值 (system stack) 並且設定,接著就可以執行 newstack function。

執行 newstack function,除了 (1) 建立一個新 user stack、 (2) 把舊 user stack 的 stack frames 複製到新 user stack 上,並且 (3) 調整 pointer 值之外,還需要調整 curg.sched 的 stack pointer 值,讓它指到新 user stack 的正確位置。

最後,從 g0 switch 回去 curg ,同樣地,把 g0 的 state 儲存到 g0 的 sched struct 中,接著取出 curg sched 中的值 (sp, pc, ctx),然後重置 sched 的值,並且從回復後的 pc 位置開始執行。

COSCUP 心得

hugo

加入 Go 社群當小志工大約一年多的時間,在去年 COSCUP 舉辦的時候,因為還不太熟悉社群再加上又是菜雞,所以去年就只是幫忙社群擺攤和管場地。而今年 Go 在 COSCUP 有自己的議程軌,同時自己也在這一年多的時間當過三次 Meetup 講者,想想覺得是時候去嘗試看看擔任 COSCUP 講者了,也希望能從準備簡報中釐清自己的觀念是否有哪些地方不夠清楚。

這次選擇的主題是我非常感興趣的記憶體管理,而且我很喜歡把 Go 和 C program 拿出來比較,透過差異性來更了解 Go 語言。在思考題目時,我很快地就決定要講 user stack ,主要原因是這個題目我在之前的 Meetup 有大略準備過,不過這次會更專注在說明 Go 的 stack 機制和實驗證明。為了這次分享,我花了很多時間在閱讀 source code 和實驗 corner case,部分實驗內容並不會放在分享上,但是透過實驗卻可以更清楚地知道 stack 運作,我覺得非常值得。

由於本次分享內容有包含 source code 和實驗展示,所以有改過 go present tool,包含調整 theme 和加入 markdown extension ,以便讓 present slides 可以全部使用 mardown 來完成。不過可惜最後有點小失敗,因為 present 是使用 remote debug server,而當場剛好手機網路連不上,要使用場地所提供的網路又要花時間輸入帳號密碼,因此只好捨棄讓聽眾能當場看實驗結果,真的很可惜,這樣的 live demo 也會失敗,有點淒慘 QQ

不過,總結來說,自己覺得自己在這場表現還算不錯,講話速度不會太快(雖然還是被同事說太緊張XD),講的也還算清楚易懂,自己在分享的時候,下面的聽眾也表現地專注而不是一臉無聊樣。很開心自己願意給自己一個機會站出來分享給其他人聽,畢竟站上來當講者還是需要一點勇氣,包含事前要花時間準備簡報、又要擔心分享的內容會不會不吸引人。雖然事前緊張,但講完之後會發覺就只是這樣而已,其實沒有想像中難,下次可以挑戰更有深度的主題 XD