go runtime 的機制如何

著作權歸作者所有。
商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
作者:qi wang
鏈接:http://www.zhihu.com/question/27305094/answer/36076688
來源:知乎

最近在瞭解Go語言的過程中,對很多語言特性的瞭解都涉及到Go Runtime的運行機制。在網上搜索一番之後,沒有看到太多有價值的信息。除了研究源代碼外,似乎沒有其他的途徑了。但我還是找到了一篇題爲:Analysis of the Go runtime scheduler 的論文,其中部分章節介紹到了Go runtime。下面把我的理解整理一下。


先上圖,這張圖描述了Go語言程序,Runtime和操作系統之間的關係。



其中,Runtime管理任務調度,垃圾收集及運行環境。大家知道Go語言程序是編譯爲機器代碼來執行的。同時,Go提供了一些高級的功能,如goroutine, channel, 以及Garbage collection。這些高級功能需要一個runtime的支持。1.4之前,runtime還是由C語言所編寫的,(按照Go dev team的規劃,1.5版本將去除C的代碼,runtime將完全由Go語言來完成。)不論何種方式,runtime和用戶編譯後的代碼被linker靜態鏈接起來,形成一個可執行文件。這個文件從操作系統角度來說是一個user space的獨立的可執行文件。


從運行的角度來說,這個文件由2部分組成,一部分是用戶的代碼,另一部分就是runtime。runtime通過接口函數調用來管理goroutine, channel及其他一些高級的功能。從用戶代碼發起的調用操作系統API的調用都會被runtime攔截並處理。


Go runtime的一個重要的組成部分是goroutine scheduler。他負責追蹤,調度每個goroutine運行,實際上是從應用程序的process所屬的thread pool中分配一個thread來執行這個goroutine。因此,和java虛擬機中的Java thread和OS thread映射概念類似,每個goroutine只有分配到一個OS thread才能運行。


事實上,go runtime非常複雜,等1.5版本出來之後,仔細研讀代碼,那時C的代碼應該已經不存在了。會比較容易理解一些。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章