Goland底層原理主題分析緒論
阿新 • • 發佈:2018-12-16
本文主要描述Golang底層的一些原理與機制,包括4個主題
1)Golang的memory manager and allocation
2)Golang的goroutine scheduler原理
3)Golang的channel實現goroutine concurrent原理
4)Golang的garbage collection原理
這篇部落格只是一個緒論,只是簡單總結一下以上各個主題的主要內容。由於題主以前寫過兩年的Java,所以希望在學習golang底層原理之後能夠將兩者相關的機制對比起來。
1. Golang的memory manager and allocation
- tcmalloc是怎麼做記憶體管理的,golang的memory manager是基於tcmalloc的。
- 逃逸分析
- 物件儲存位置 heap or stack
- golang的多級記憶體分配是怎麼做的?有哪幾級?分別對應什麼模型?什麼情況下會逐級網上申請?mcache、mcentral、mheap。
- goroutine的stack是從哪裡申請到的
2. Golang的goroutine scheduler原理
- 排程的goroutine和底層的OS執行緒有什麼關係
- M、G、P分別代表什麼,維護了哪些資料,G、M、P的對映關係是怎麼樣的
- 如果goroutine-A因為syscall或則DB的IO等操作blocking了,scheduler會怎麼做?因為底層的OS執行緒也會阻塞,所以需要探討會怎麼做;如果goroutine-A的blocking恢復了,會繼續在原來的M和P中執行嘛?
- Go的系統裡面的P和M的數量上限是多少?scheduler是怎麼動態排程的。
- 如果某一個P裡面goroutine的runqueue執行完畢,work-stealing是怎麼做的
GOMAXPROCS數量等價於P數量
new goroutine 等價於G,等價於 runtime·newproc()
newm()建立核心執行緒等價於M
上面的這些機制不僅僅理解原理還要對照原始碼做分析
-
如果一個goroutine一直佔有CPU又不會有阻塞或則主動讓出CPU的排程,scheduler怎麼做搶佔式排程讓出CPU‘
-
G、P、M狀態機
go1.2版本之前的排程器存在的問題
3. Golang的channel實現goroutine concurrent原理
本文假設讀者已經瞭解Go裡面channel的基本使用方式。本文主要講解以下幾個問題:
- 什麼是CSP,channel是怎麼基於CSP這種思想設計的
- channel的基本使用方式
- make channel的呼叫,底層執行了什麼什麼操作
- channel底層的儲存結構是怎麼樣的
- 向channel裡面傳送或則從channel接收資料的流程是怎麼樣的,與底層儲存有什麼關係
- 對於一個有緩衝的channel,如果channel滿了,goroutine-A繼續寫入會發生什麼?
- 對於一個有緩衝的channel,如果channel為空,goroutine-B從裡面讀會發生什麼?
- 對於一個有緩衝的channel,當channel未滿且非空時候,讀寫會發生什麼?
- 對於6、7、8主要關注goroutine和排程器做出的與channel相關的決策。
- 在不同時機(case6、7、8)下如果close一個channel會有什麼後果,如果繼續進行讀寫會造成什麼後果。
- 如果channel是nil,往裡面讀寫會產生什麼後果
- channel實現底層有哪些效能優化的地方:優化鎖和記憶體copy?
分析的主要原始碼部分:chan.go、runtime2.go、malloc.go、proc.go、mbarrier.go等等
主要涉及的其餘原始碼檔案的函式有:
1)mallocgc()、memmove()
2)gopark()、goready()
3)lock()、unlock()
4)getg()、acquireSudog()、releaseSudog()
4. Golang的garbage collection原理
- GC回收演算法有哪些,有沒有針對不同性質(老年代和新生代)做不同演算法處理
- GC的起點是那些,檢測GC的演算法是什麼