1. 程式人生 > >Goland底層原理主題分析緒論

Goland底層原理主題分析緒論

本文主要描述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

  1. tcmalloc是怎麼做記憶體管理的,golang的memory manager是基於tcmalloc的。
  2. 逃逸分析
  3. 物件儲存位置 heap or stack
  4. golang的多級記憶體分配是怎麼做的?有哪幾級?分別對應什麼模型?什麼情況下會逐級網上申請?mcache、mcentral、mheap。
  5. goroutine的stack是從哪裡申請到的

2. Golang的goroutine scheduler原理

  1. 排程的goroutine和底層的OS執行緒有什麼關係
  2. M、G、P分別代表什麼,維護了哪些資料,G、M、P的對映關係是怎麼樣的
  3. 如果goroutine-A因為syscall或則DB的IO等操作blocking了,scheduler會怎麼做?因為底層的OS執行緒也會阻塞,所以需要探討會怎麼做;如果goroutine-A的blocking恢復了,會繼續在原來的M和P中執行嘛?
  4. Go的系統裡面的P和M的數量上限是多少?scheduler是怎麼動態排程的。
  5. 如果某一個P裡面goroutine的runqueue執行完畢,work-stealing是怎麼做的

GOMAXPROCS數量等價於P數量
new goroutine 等價於G,等價於 runtime·newproc()
newm()建立核心執行緒等價於M
上面的這些機制不僅僅理解原理還要對照原始碼做分析

  1. 如果一個goroutine一直佔有CPU又不會有阻塞或則主動讓出CPU的排程,scheduler怎麼做搶佔式排程讓出CPU‘

  2. G、P、M狀態機

go1.2版本之前的排程器存在的問題

3. Golang的channel實現goroutine concurrent原理

本文假設讀者已經瞭解Go裡面channel的基本使用方式。本文主要講解以下幾個問題:

  1. 什麼是CSP,channel是怎麼基於CSP這種思想設計的
  2. channel的基本使用方式
  3. make channel的呼叫,底層執行了什麼什麼操作
  4. channel底層的儲存結構是怎麼樣的
  5. 向channel裡面傳送或則從channel接收資料的流程是怎麼樣的,與底層儲存有什麼關係
  6. 對於一個有緩衝的channel,如果channel滿了,goroutine-A繼續寫入會發生什麼?
  7. 對於一個有緩衝的channel,如果channel為空,goroutine-B從裡面讀會發生什麼?
  8. 對於一個有緩衝的channel,當channel未滿且非空時候,讀寫會發生什麼?
  9. 對於6、7、8主要關注goroutine和排程器做出的與channel相關的決策。
  10. 在不同時機(case6、7、8)下如果close一個channel會有什麼後果,如果繼續進行讀寫會造成什麼後果。
  11. 如果channel是nil,往裡面讀寫會產生什麼後果
  12. 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原理

  1. GC回收演算法有哪些,有沒有針對不同性質(老年代和新生代)做不同演算法處理
  2. GC的起點是那些,檢測GC的演算法是什麼