go runtime 的機制如何

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。著作權歸作者所有。
商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
作者: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的代碼應該已經不存在了。會比較容易理解一些。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.