基本設計思路:
創(chuàng)新互聯(lián)建站主要從事網(wǎng)站設計、成都網(wǎng)站設計、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務措勤,十多年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18980820575
類型轉換、類型斷言、動態(tài)派發(fā)。iface,eface。
反射對象具有的方法:
編譯優(yōu)化:
內(nèi)部實現(xiàn):
實現(xiàn) Context 接口有以下幾個類型(空實現(xiàn)就忽略了):
互斥鎖的控制邏輯:
設計思路:
(以上為寫被讀阻塞,下面是讀被寫阻塞)
總結,讀寫鎖的設計還是非常巧妙的:
設計思路:
WaitGroup 有三個暴露的函數(shù):
部件:
設計思路:
結構:
Once 只暴露了一個方法:
實現(xiàn):
三個關鍵點:
細節(jié):
讓多協(xié)程任務的開始執(zhí)行時間可控(按順序或歸一)。(Context 是控制結束時間)
設計思路: 通過一個鎖和內(nèi)置的 notifyList 隊列實現(xiàn),Wait() 會生成票據(jù),并將等待協(xié)程信息加入鏈表中,等待控制協(xié)程中發(fā)送信號通知一個(Signal())或所有(Boardcast())等待者(內(nèi)部實現(xiàn)是通過票據(jù)通知的)來控制協(xié)程解除阻塞。
暴露四個函數(shù):
實現(xiàn)細節(jié):
部件:
包: golang.org/x/sync/errgroup
作用:開啟 func() error 函數(shù)簽名的協(xié)程,在同 Group 下協(xié)程并發(fā)執(zhí)行過程并收集首次 err 錯誤。通過 Context 的傳入,還可以控制在首次 err 出現(xiàn)時就終止組內(nèi)各協(xié)程。
設計思路:
結構:
暴露的方法:
實現(xiàn)細節(jié):
注意問題:
包: "golang.org/x/sync/semaphore"
作用:排隊借資源(如錢,有借有還)的一種場景。此包相當于對底層信號量的一種暴露。
設計思路:有一定數(shù)量的資源 Weight,每一個 waiter 攜帶一個 channel 和要借的數(shù)量 n。通過隊列排隊執(zhí)行借貸。
結構:
暴露方法:
細節(jié):
部件:
細節(jié):
包: "golang.org/x/sync/singleflight"
作用:防擊穿。瞬時的相同請求只調(diào)用一次,response 被所有相同請求共享。
設計思路:按請求的 key 分組(一個 *call 是一個組,用 map 映射存儲組),每個組只進行一次訪問,組內(nèi)每個協(xié)程會獲得對應結果的一個拷貝。
結構:
邏輯:
細節(jié):
部件:
如有錯誤,請批評指正。
《Go 語言程序設計》(Mark Summerfield)電子書網(wǎng)盤下載免費在線閱讀
資源鏈接:
鏈接:
提取碼:br6t ?
書名:Go 語言程序設計
作者:Mark Summerfield
譯者:許式偉
豆瓣評分:6.9
出版社:人民郵電出版社
出版年份:2013-8-1
頁數(shù):354
內(nèi)容簡介:
國外最經(jīng)典的Go語言著作,Go語言編程的先驅(qū)者Mark Summerfield的實踐經(jīng)驗總結。
這是一本Go語言實戰(zhàn)指南,幫你了解Go語言,按Go語言的方式思考,以及使用Go語言來編寫高性能軟件。
作者展示了如何編寫充分利用Go語言突破性的特性和慣用法的代碼,以及Go語言在其他語言之上所做的改進,并著重強調(diào)了Go語言的關鍵創(chuàng)新。
注重實踐教學,每章都提供了多個經(jīng)過精心設計的代碼示例。
由國內(nèi)第一個核心服務完全采用Go語言實現(xiàn)的團隊——七牛團隊核心成員翻譯。
作者簡介:
Mark Summerfield Qtrac公司創(chuàng)始人,獨立的培訓講師、顧問、技術編輯,Go、Python、C++、Qt和PyQt方面的技術作家。他的著作包括Rapid GUI Programming with Python and Qt、C++ GUI Programming with Qt 4(與Jasmin Blanchette合著)、Programming in Python 3和Advanced Qt Programming等。
許式偉——七牛云存儲CEO,開源愛好者,發(fā)布過十余個C++開源項目,擁有超過15年的C/C++開發(fā)經(jīng)驗。
呂桂華——七牛云存儲聯(lián)合創(chuàng)始人,擁有十余年的C/C++大型項目開發(fā)經(jīng)驗,也曾在Java和.NET平臺上探索多年。
徐 立——七牛云存儲首席布道師,前盛大創(chuàng)新院高級研究員。
何李石——七牛云存儲布道師。
七牛云存儲技術團隊是國內(nèi)第一個核心服務完全采用Go語言實現(xiàn)的團隊。
最近在看左神新書 《Go 語言設計與實現(xiàn)》的垃圾收集器時產(chǎn)生一個疑惑,花了點時間搞清楚了記錄一下。
Go 語言垃圾回收的實現(xiàn)使用了標記清除算法,將對象的狀態(tài)抽象成黑色(活躍對象)、灰色(活躍對象中間狀態(tài))、白色(潛在垃圾對象也是所有對象的默認狀態(tài))三種,注意沒有具體的字段標記顏色。
整個標記過程就是把白色對象標黑的過程:
1.首先將 ROOT 根對象(包括全局變量、goroutine 棧上的對象等)放入到灰色集合
2.選一個灰色對象,標成黑色,將所有可達的子對象放入到灰色集合
3.重復2的步驟,直到灰色集合中為空
下圖是書上的插圖,看上去是一個典型的深度優(yōu)先搜索的算法。
下圖是劉丹冰寫的《Golang 修養(yǎng)之路》的插圖,看上去是一個典型的廣度優(yōu)先搜索的算法。
我疑惑的點在于這個標記過程是深度優(yōu)先算法還是廣度優(yōu)先算法,因為很多文章博客對此都沒有很清楚的說明,作為學習者這種細節(jié)其實也不影響對整個 GC 流程的理解,但是這種細節(jié)我非常喜歡扣:)
對著書和源碼摸索著大致找到了一個結果是深度優(yōu)先。下面看下大致的過程,源碼基于1.15.2版本:
gcStart 是 Go 語言三種條件觸發(fā) GC 的共同入口
啟動后臺標記任務
為每個處理器創(chuàng)建用于執(zhí)行后臺標記任務的 Goroutine
上面休眠的 G 會在調(diào)度循環(huán)中檢查并喚醒執(zhí)行
執(zhí)行標記
gcw 是每個 P 獨有的所以不用擔心并發(fā)的問題 和 GMP、mcache 一樣設計,減少鎖競爭
嘗試在全局列表中獲取一個不為空的 buf
這是官方實現(xiàn)的無鎖隊列:)漲見識了,for 循環(huán)加原子操作實現(xiàn)棧的 pop
到這里從灰色集合中獲取待掃描的對象邏輯說完了。找到對象了接著就是 scanobject(b, gcw) 了,里面有兩段邏輯要注意
根據(jù)索引位置找到對象進行標色
嘗試存入 gcwork 的緩存中,或全局隊列中
無鎖隊列,for 循環(huán)加原子操作實現(xiàn)棧的 push
到這里把灰色對象標黑就完成了,又放回灰色集合接著掃下一個指針。
Go 語言設計與實現(xiàn) 垃圾收集器
Golang三色標記+混合寫屏障GC模式全分析