精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

曹大帶我學 Go之哪里來的 Goexit

開發 后端
在學員群里,有同學在用 dlv 調試時看到了令人不解的 goexit:goexit 函數是啥,為啥 go fun(){}() 的上層是它?看著像是一個“退出”函數,為什么會出現在最上層?

[[404148]]

本文轉載自微信公眾號「碼農桃花源」,作者小X。轉載本文請聯系碼農桃花源公眾號。

你好,我是小X。

曹大最近開 Go 課程了,小X 正在和曹大學 Go。

這個系列會講一些從課程中學到的讓人醍醐灌頂的東西,撥云見日,帶你重新認識 Go。

在學員群里,有同學在用 dlv 調試時看到了令人不解的 goexit:goexit 函數是啥,為啥 go fun(){}() 的上層是它?看著像是一個“退出”函數,為什么會出現在最上層?

其實如果看過 pprof 的火焰圖,也會經常看到 goexit 這個函數。

我們來個例子重現一下:

  1. package main 
  2.  
  3. import "time" 
  4.  
  5. func main() { 
  6.  go func ()  { 
  7.   println("hello world"
  8.  }() 
  9.   
  10.  time.Sleep(10*time.Minute

啟動 dlv 調試,并分別在不同的地方打上斷點:

  1. (dlv) b a.go:5  
  2. Breakpoint 1 (enabled) set at 0x106d12f for main.main() ./a.go:5 
  3. (dlv) b a.go:6 
  4. Breakpoint 2 (enabled) set at 0x106d13d for main.main() ./a.go:6 
  5. (dlv) b a.go:7 
  6. Breakpoint 3 (enabled) set at 0x106d1a0 for main.main.func1() ./a.go:7 

執行命令 c 運行到斷點處,再執行 bt 命令得到 main 函數的調用棧:

  1. (dlv) bt 
  2. 0  0x000000000106d12f in main.main 
  3.    at ./a.go:5 
  4. 1  0x0000000001035c0f in runtime.main 
  5.    at /usr/local/go/src/runtime/proc.go:204 
  6. 2  0x0000000001064961 in runtime.goexit 
  7.    at /usr/local/go/src/runtime/asm_amd64.s:1374 

它的上一層是 runtime.main,找到原代碼位置,位于 src/runtime/proc.go 里的 main 函數,它是 Go 進程的 main goroutine,這里會執行一些 init 操作、開啟 GC、執行用戶 main 函數……

  1. fn := main_main // proc.go:203 
  2. fn() // proc.go:204 

其中 fn 是 main_main 函數,表示用戶的 main 函數,執行到了這里,才真正將權力交給用戶。

繼續執行 c 命令和 bt 命令,得到 go 這一行的調用棧:

  1. 0  0x000000000106d13d in main.main 
  2.    at ./a.go:6 
  3. 1  0x0000000001035c0f in runtime.main 
  4.    at /usr/local/go/src/runtime/proc.go:204 
  5. 2  0x0000000001064961 in runtime.goexit 
  6.    at /usr/local/go/src/runtime/asm_amd64.s:1374 

以及 println 這一句的調用棧:

  1. 0  0x000000000106d1a0 in main.main.func1 
  2.    at ./a.go:7 
  3. 1  0x0000000001064961 in runtime.goexit 
  4.    at /usr/local/go/src/runtime/asm_amd64.s:1374 

可以看到,調用棧的最上層都是 runtime.goexit,我們跟著注明了的代碼行數,順藤摸瓜,找到 goexit 代碼:

  1. // The top-most function running on a goroutine 
  2. // returns to goexit+PCQuantum. 
  3. TEXT runtime·goexit(SB),NOSPLIT,$0-0 
  4.     BYTE    $0x90   // NOP 
  5.     CALL    runtime·goexit1(SB) // does not return 
  6.     // traceback from goexit1 must hit code range of goexit 
  7.     BYTE    $0x90   // NOP 

這還是個匯編函數,它接著調用 goexit1 函數、goexit0 函數,主要的功能就是將 goroutine 的各個字段清零,放入 gFree 隊列里,等待將來進行復用。

另一方面,goexit 函數的地址是在創建 goroutine 的過程中,塞到棧上的。讓 CPU “誤以為”:func() 是由 goexit 函數調用的。這樣一來,當 func() 執行完畢時,會返回到 goexit 函數做一些清理工作。

下面這張圖能看出在 newg 的棧底塞了一個 goexit 函數的地址:

goexit 返回地址

對應的路徑是:

  1. newporc -> newporc1 -> gostartcallfn -> gostartcall 

來看 newproc1 中的關鍵幾行代碼:

  1. newg.sched.pc = funcPC(goexit) + sys.PCQuantum 
  2. newg.sched.g = guintptr(unsafe.Pointer(newg)) 
  3. gostartcallfn(&newg.sched, fn) 

這里的 newg 就是創建的 goroutine,每個新建的 goroutine 都會執行這些代碼。而 sched 結構體其實保存的是 goroutine 的執行現場,每當 goroutine 被調離 CPU,它的執行進度就是保存到這里。進度主要就是 SP、BP、PC,分別表示棧頂地址、棧底地址、指令位置,等 goroutine 再次得到 CPU 的執行權時,會把 SP、BP、PC 加載到寄存器中,從而從斷點處恢復運行。

回到上面的幾行代碼,pc 被賦值成了 funcPC(goexit),最后在 gostartcall 里:

  1. // adjust Gobuf as if it executed a call to fn with context ctxt 
  2. // and then did an immediate gosave. 
  3. func gostartcall(buf *gobuf, fn, ctxt unsafe.Pointer) { 
  4.  sp := buf.sp 
  5.  ... 
  6.  sp -= sys.PtrSize 
  7.  *(*uintptr)(unsafe.Pointer(sp)) = buf.pc 
  8.  buf.sp = sp 
  9.  buf.pc = uintptr(fn) 
  10.  buf.ctxt = ctxt 

sp 其實就是棧頂,第 7 行代碼把 buf.pc,也就是 goexit 的地址,放在了棧頂的地方,熟悉 Go 函數調用規約的朋友知道,這個位置其實就是 return addr,將來等 func() 執行完,就會回到父函數繼續執行,這里的父函數其實就是 goexit。

一切早已注定。

不過注意一點,main goroutine 和普通的 goroutine 不同的是,前者執行完用戶 main 函數后,會直接執行 exit 調用,整個進程退出:

exit

也就不會進入 goexit 函數。而普通 goroutine 執行完畢后,則直接進入 goexit 函數,做一些清理工作。

這也就是為什么只要 main goroutine 執行完了,就不會等其他 goroutine,直接退出。一切都是因為 exit 這個調用。

今天我們主要講了 goexit 是怎么被安插到 goroutine 的棧上,從而實現 goroutine 執行完畢后再回到 goexit 函數。

原來看似很不理解的東西,是不是更清晰了?

源碼面前,了無秘密。

好了,這就是今天全部的內容了~ 我是小X,我們下期再見~

 

責任編輯:武曉燕 來源: 碼農桃花源
相關推薦

2021-06-10 09:00:32

Go底層代碼

2021-08-09 07:47:39

ExtraGoMap

2021-06-01 09:27:53

Ast Go語言

2021-07-15 08:58:15

指定配置項Go

2021-05-20 08:59:47

Go調度本質

2021-05-27 08:59:09

Go匯編命令

2022-01-05 08:56:20

Go火焰圖編程

2011-05-03 09:34:14

項目經理

2020-04-17 10:50:19

5G運營商網絡

2023-05-26 08:21:59

Lock_TimeMySQL

2021-12-31 14:39:29

AI 數據人工智能

2022-04-06 08:58:39

歸并排序Go算法

2015-05-04 17:36:49

大數據跨過幾道坎

2018-05-23 10:23:18

數據系統機器學習

2017-06-19 07:58:40

2021-10-10 15:01:09

Go 源碼Github

2022-02-09 07:52:36

GolangGo語言

2020-07-31 07:55:21

JavaFuture接口

2016-12-01 14:16:18

GitSCM配置

2021-02-22 09:30:09

go開發環境桌面系統
點贊
收藏

51CTO技術棧公眾號

日本aⅴ亚洲精品中文乱码| 成人亚洲精品| 久久婷婷国产综合精品青草| 91av在线不卡| 国产精久久一区二区三区| 日韩精品麻豆| 亚洲美女视频在线| 精选一区二区三区四区五区| 亚洲 欧美 中文字幕| 成人在线免费观看91| 日韩西西人体444www| 久久人人爽人人爽人人av| 亚洲aⅴ在线观看| 麻豆精品在线播放| 久久久久成人网| 亚洲av无码国产精品麻豆天美| 亚洲欧洲日韩精品在线| 精品国产老师黑色丝袜高跟鞋| 色综合视频二区偷拍在线| 国产黄色片免费观看| 日韩黄色在线观看| 欧美高清视频免费观看| 欧美xxxx精品| 日韩有码中文字幕在线| 91精品婷婷国产综合久久性色| 女人和拘做爰正片视频| 中文字幕有码在线观看| 中文字幕精品一区二区三区精品| 国产99午夜精品一区二区三区| 中文在线观看av| 9国产精品视频| 欧美日韩成人黄色| 成人午夜免费影院| 精品中文一区| 日韩av一区在线| 波多野结衣网页| 日本一区二区三区视频在线| 午夜精品久久久久久久蜜桃app| 宅男在线精品国产免费观看| 欧美一区二区视频| 成人av资源站| 超碰97人人人人人蜜桃| 97精品人妻一区二区三区在线 | 欧美日本韩国国产| 韩国av电影在线观看| 国内外成人在线视频| 国产精品一区久久久| 国产精品久久久久久久久久久久久久久久久 | 91成人理论电影| 一区二区自拍偷拍| 欧美啪啪一区| 久久99国产综合精品女同| 一区二区三区影视| 91精品综合| 日韩在线视频一区| 91制片厂在线| 91综合久久| 神马久久桃色视频| 一本色道久久88| 第四色成人网| 日韩专区在线播放| 国产在线免费看| 91蜜臀精品国产自偷在线| 自拍偷拍亚洲区| 国产白丝一区二区三区| 91麻豆精品国产91久久久平台| 色黄久久久久久| 国产精品久久国产精麻豆96堂| av中文字幕一区二区| 中文字幕在线成人| www日韩在线| 欧美久久一区| 久久久欧美一区二区| 久久久久久久极品| 玖玖玖国产精品| 国产欧美精品xxxx另类| 国产精品乱码久久久| 国产精品888| 国产综合欧美在线看| 人成免费电影一二三区在线观看| 国产人成一区二区三区影院| 尤物一区二区三区| 四虎亚洲精品| 欧美色另类天堂2015| youjizzxxxx18| 美国十次综合久久| 日韩av一区在线观看| 亚洲AV无码片久久精品| 欧美高清视频手机在在线| 久久精品中文字幕电影| 国产一二三四在线| 免费视频一区二区三区在线观看| 国产精品老牛影院在线观看| 国产乱码精品一区二区| 成人精品国产一区二区4080 | 精品99在线| 色多多国产成人永久免费网站| 青青草免费av| 午夜综合激情| 国产欧美久久一区二区| 亚洲乱色熟女一区二区三区| 99视频在线精品| 亚洲 日韩 国产第一区| 手机在线免费观看av| 日本高清不卡aⅴ免费网站| 一级黄色片在线免费观看| 菁菁伊人国产精品| www.xxxx欧美| xxxx.国产| 国产在线一区观看| 欧美日韩一区二区视频在线观看| 国产区在线看| 色综合色狠狠综合色| 超级砰砰砰97免费观看最新一期| 亚洲性视频大全| 久久777国产线看观看精品| 狠狠人妻久久久久久综合| 国产精品一区二区久激情瑜伽| 国产精品视频福利| 九七久久人人| 日本韩国欧美国产| 国产黄色一区二区三区| 国产一区网站| 2019亚洲男人天堂| 97人妻一区二区精品免费视频 | 国产丝袜不卡| 二区在线播放| 欧美三片在线视频观看| 人妻丰满熟妇av无码久久洗澡| 亚洲啊v在线观看| 国产国语刺激对白av不卡| 内射后入在线观看一区| 亚洲少妇最新在线视频| 日本免费观看网站| 欧美福利在线播放网址导航| 欧美国产日韩免费| 国产一区二区自拍视频| 欧美国产激情一区二区三区蜜月 | 免费在线看一区| 欧美日韩亚洲在线| 在线观看爽视频| 亚洲成人动漫在线播放| 欧美日韩精品亚洲精品| 国产一区二区毛片| 99热都是精品| 国产精品白丝久久av网站| 在线视频国产日韩| 亚洲品质自拍视频网站| 亚洲 国产 欧美一区| 偷拍中文亚洲欧美动漫| 亚洲精品中文字幕有码专区| 日本少妇bbwbbw精品| 国产成人免费网站| 50度灰在线观看| 日韩成人在线看| 欧美成人在线影院| 精品黑人一区二区三区国语馆| 1024成人网| 亚洲综合20p| 午夜精品电影| 国产高清自拍一区| а_天堂中文在线| 亚洲高清一二三区| 国产精品免费av一区二区| av在线综合网| 欧美日韩在线不卡视频| 国产日产精品一区二区三区四区的观看方式| 97av在线视频| 黄色在线免费观看大全| 在线亚洲一区二区| 老司机福利在线观看| 美女网站在线免费欧美精品| 中文字幕在线中文字幕日亚韩一区 | 亚洲视频在线观看一区二区| 中文字幕不卡的av| 亚洲a级黄色片| 日韩电影大全在线观看| 国产69精品久久| 久热99视频在线观看| 亚洲奶汁xxxx哺乳期| 欧美午夜无遮挡| 日本黄色激情视频| 国产剧情一区二区| 国产精品自拍片| 精品国产成人| 亚洲一区制服诱惑| 欧美男男tv网站在线播放| 亚洲色无码播放| 97成人免费视频| 午夜精品福利一区二区三区av| a天堂中文字幕| 日日摸夜夜添夜夜添亚洲女人| 这里只有精品66| 免费萌白酱国产一区二区三区| 国产精品99导航| 亚洲综合伊人久久大杳蕉| 亚洲韩国青草视频| 欧美男人天堂网| 一区二区三区欧美日| 成人免费无码大片a毛片| 免费在线观看一区二区三区| 99国产精品白浆在线观看免费| 一区二区三区视频免费观看| 成人国产精品色哟哟| 交100部在线观看| 日韩亚洲一区二区| 午夜视频在线免费播放| 欧美男生操女生| 亚洲精品国产精品乱码| 亚洲欧洲av在线| www.自拍偷拍| 国产激情91久久精品导航| 大香煮伊手机一区| 在线国产日韩| www.午夜色| 国产区精品区| 久久国产手机看片| 久久一级大片| 国产精品白丝jk喷水视频一区| 人人澡人人添人人爽一区二区| 一区二区三区四区在线观看视频| 亚洲第一天堂影院| 在线不卡a资源高清| 日韩综合在线观看| 五月婷婷色综合| 国产97免费视频| 国产精品美女久久久久高潮| 亚洲 欧美 日韩在线| 国产一区二区视频在线播放| 国产情侣av自拍| 一区二区三区四区五区精品视频 | 日韩欧美中文字幕在线播放| 农村黄色一级片| 国产精品水嫩水嫩| 亚洲 小说 欧美 激情 另类| 成人动漫精品一区二区| 97免费公开视频| 精品亚洲成a人| 天堂网在线免费观看| 丝袜国产日韩另类美女| 国产午夜大地久久| 国内精品久久久久久久影视麻豆| 午夜啪啪福利视频| 偷拍欧美精品| 一区二区三区四区五区视频 | 亚洲乱码一区av黑人高潮| 免费av一级片| 亚洲精品一区二区三区福利| 精品黑人一区二区三区国语馆| 欧美一区二区在线观看| 国产精品无码免费播放| 欧美巨大另类极品videosbest | 怡红院在线观看| 九九精品在线视频| 欧美日韩在线视频免费观看| 欧美理论片在线观看| 国语对白在线刺激| 国内久久久精品| 国产美女高潮在线观看| 91超碰caoporn97人人| 97人澡人人添人人爽欧美| 午夜精品久久久久久久久久久久 | 亚州av在线播放| 日韩av在线看| 久久视频www| 中文字幕日韩精品有码视频| 日本综合在线| 久久中国妇女中文字幕| 日韩少妇视频| 97免费视频在线播放| 成人影院av| 国产精品日韩欧美综合| 日韩av黄色| 99免费在线观看视频| 人体久久天天| 日韩av不卡播放| 999久久久91| 久久久久久久香蕉| 国产亚洲成人一区| 一区二区三区视频在线观看免费| 激情都市一区二区| 亚洲欧美综合视频| 久久亚洲二区三区| 婷婷激情四射网| 亚洲大型综合色站| 中文字幕一区二区三区波野结| 在线成人免费视频| 日本黄色免费视频| 亚洲香蕉伊综合在人在线视看| 9191在线观看| 久久久免费在线观看| 日韩三区在线| 99久久久精品免费观看国产| 午夜先锋成人动漫在线| 一区二区不卡在线视频 午夜欧美不卡'| 亚州av乱码久久精品蜜桃| 欧美精品自拍视频| 秋霞电影一区二区| 亚洲啪av永久无码精品放毛片 | 久久精品日韩| 99久久综合| av免费观看国产| 精品一区二区在线视频| 最近中文字幕无免费| 中文字幕一区二区三区色视频| 日韩三级小视频| 欧美日韩日本视频| 日本韩国一区| 欧美成年人视频网站| 韩国三级一区| 国产三区精品| 中文视频一区| 自拍偷拍 国产| 成人18精品视频| 欧美大片xxxx| 欧美三级视频在线播放| 亚洲人成色777777精品音频| 久久精品国亚洲| 欧美黄色三级| 久久久影院一区二区三区| 欧美国产三区| 中文av字幕在线观看| 国产三级精品三级在线专区| 精品无码av在线| 欧美疯狂性受xxxxx喷水图片| 日本福利在线观看| 国内精品久久久久久中文字幕| 亚洲狼人在线| 香蕉久久夜色| 肉丝袜脚交视频一区二区| 少妇欧美激情一区二区三区| 国产精品初高中害羞小美女文| 久久黄色精品视频| 亚洲国产精品小视频| 3d玉蒲团在线观看| 成人啪啪免费看| 日韩三级在线| 91蝌蚪视频在线观看| 久久这里都是精品| 日韩手机在线观看| 亚洲第一级黄色片| 免费不卡av| 国产精品一区二区三区免费观看 | www.亚洲一区| 成人亚洲网站| 日本一区二区精品视频| 久久五月激情| 久久亚洲无码视频| 日本韩国一区二区| 超碰免费在线观看| 国产精品美女免费看| 欧美色就是色| 91人人澡人人爽人人精品| 国产精品丝袜一区| 国产精品久久久久毛片| 欧美成年人视频| 一区二区三区视频免费视频观看网站 | 日韩av片网站| 国产精品污www在线观看| 中文字幕欧美人妻精品| 日韩亚洲欧美中文高清在线| 国产麻豆一区二区三区| 特级西西人体www高清大胆| 国产高清久久久| 国产精品6666| 国产丝袜高跟一区| 日本成人片在线| 亚洲欧美丝袜| 久草精品在线观看| 精品爆乳一区二区三区无码av| 精品国产精品网麻豆系列| 精精国产xxxx视频在线播放| 日本精品一区二区三区不卡无字幕| 日韩电影在线观看一区| 亚洲aaa视频| 欧美成人免费网站| 三妻四妾的电影电视剧在线观看 | 能看毛片的网站| 亚洲成人激情av| 韩国中文免费在线视频| 成人国产精品一区| 亚洲狼人精品一区二区三区| b站大片免费直播| 欧美日韩黄视频| www.综合网.com| 日本欧洲国产一区二区| 狠狠色狠狠色综合系列| 日本熟伦人妇xxxx| 在线观看久久av| 亚洲国产中文在线| aaaaaa亚洲| 亚洲免费视频中文字幕| 天堂a√中文在线| 91九色国产社区在线观看| 最新日韩av| 亚洲毛片亚洲毛片亚洲毛片| 337p日本欧洲亚洲大胆色噜噜| 欧美一区国产| av片在线免费| 国产欧美va欧美不卡在线|