中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

go語言大佬 go語言入門指南

Go語言——goroutine并發(fā)模型

參考:

成都創(chuàng)新互聯公司提供高防服務器、云服務器、香港服務器、成都機柜租用

Goroutine并發(fā)調度模型深度解析手擼一個協(xié)程池

Golang 的 goroutine 是如何實現的?

Golang - 調度剖析【第二部分】

OS線程初始棧為2MB。Go語言中,每個goroutine采用動態(tài)擴容方式,初始2KB,按需增長,最大1G。此外GC會收縮棧空間。

BTW,增長擴容都是有代價的,需要copy數據到新的stack,所以初始2KB可能有些性能問題。

更多關于stack的內容,可以參見大佬的文章。 聊一聊goroutine stack

用戶線程的調度以及生命周期管理都是用戶層面,Go語言自己實現的,不借助OS系統(tǒng)調用,減少系統(tǒng)資源消耗。

Go語言采用兩級線程模型,即用戶線程與內核線程KSE(kernel scheduling entity)是M:N的。最終goroutine還是會交給OS線程執(zhí)行,但是需要一個中介,提供上下文。這就是G-M-P模型

Go調度器有兩個不同的運行隊列:

go1.10\src\runtime\runtime2.go

Go調度器根據事件進行上下文切換。

調度的目的就是防止M堵塞,空閑,系統(tǒng)進程切換。

詳見 Golang - 調度剖析【第二部分】

Linux可以通過epoll實現網絡調用,統(tǒng)稱網絡輪詢器N(Net Poller)。

文件IO操作

上面都是防止M堵塞,任務竊取是防止M空閑

每個M都有一個特殊的G,g0。用于執(zhí)行調度,gc,棧管理等任務,所以g0的棧稱為調度棧。g0的棧不會自動增長,不會被gc,來自os線程的棧。

go1.10\src\runtime\proc.go

G沒辦法自己運行,必須通過M運行

M通過通過調度,執(zhí)行G

從M掛載P的runq中找到G,執(zhí)行G

Go語言使用 map 時盡量不要在 big map 中保存指針

不知道你有沒有聽過這么一句:在使用 map 時盡量不要在 big map 中保存指針。好吧,你現在已經聽過了:)為什么呢?原因在于 Go 語言的垃圾回收器會掃描標記 map 中的所有元素,GC 開銷相當大,直接GG。

這兩天在《Mastering Go》中看到 GC 這一章節(jié)里面對比 map 和 slice 在垃圾回收中的效率對比,書中只給出結論沒有說明理由,這我是不能忍的,于是有了這篇學習筆記。扯那么多,Show Your Code

這是一個簡單的測試程序,保存字符串的 map 和 保存整形的 map GC 的效率相差幾十倍,是不是有同學會說明明保存的是 string 哪有指針?這個要說到 Go 語言中 string 的底層實現了,源碼在 src/runtime/string.go里,可以看到 string 其實包含一個指向數據的指針和一個長度字段。注意這里的是否包含指針,包括底層的實現。

Go 語言的 GC 會遞歸遍歷并標記所有可觸達的對象,標記完成之后將所有沒有引用的對象進行清理。掃描到指針就會往下接著尋找,一直到結束。

Go 語言中 map 是基于 數組和鏈表 的數據結構實現的,通過 優(yōu)化的拉鏈法 解決哈希沖突,每個 bucket 可以保存 8 對鍵值,在 8 個鍵值對數據后面有一個 overflow 指針,因為桶中最多只能裝 8 個鍵值對,如果有多余的鍵值對落到了當前桶,那么就需要再構建一個桶(稱為溢出桶),通過 overflow 指針鏈接起來。

因為 overflow 指針的緣故,所以無論 map 保存的是什么,GC 的時候就會把所有的 bmap 掃描一遍,帶來巨大的 GC 開銷。官方 issues 就有關于這個問題的討論, runtime: Large maps cause significant GC pauses #9477

無腦機翻如下:

如果我們有一個map [k] v,其中k和v都不包含指針,并且我們想提高掃描性能,則可以執(zhí)行以下操作。

將“ allOverflow [] unsafe.Pointer”添加到 hmap 并將所有溢出存儲桶存儲在其中。 然后將 bmap 標記為noScan。 這將使掃描非???,因為我們不會掃描任何用戶數據。

實際上,它將有些復雜,因為我們需要從allOverflow中刪除舊的溢出桶。 而且它還會增加 hmap 的大小,因此也可能需要重新整理數據。

最終官方在 hmap 中增加了 overflow 相關字段完成了上面的優(yōu)化,這是具體的 commit 地址。

下面看下具體是如何實現的,源碼基于 go1.15,src/cmd/compile/internal/gc/reflect.go 中

通過注釋可以看出,如果 map 中保存的鍵值都不包含指針(通過 Haspointers 判斷),就使用一個 uintptr 類型代替 bucket 的指針用于溢出桶 overflow 字段,uintptr 類型在 GO 語言中就是個大小可以保存得下指針的整數,不是指針,就相當于實現了 將 bmap 標記為 noScan, GC 的時候就不會遍歷完整個 map 了。隨著不斷的學習,愈發(fā)感慨 GO 語言中很多模塊設計得太精妙了。

差不多說清楚了,能力有限,有不對的地方歡迎留言討論,源碼位置還是問的群里大佬 _

哪些知名公司在使用Golang語言

Go語言是谷歌2009發(fā)布的第二款開源編程語言。

Go語言專門針對多處理器系統(tǒng)應用程序的編程進行了優(yōu)化,使用Go編譯的程序可以媲美C或C++代碼的速度,而且更加安全、支持并行進程。

現在很多知名公司都在使用Go語言,比如說:Google、Facebook、騰訊、百度、阿里、京東、小米、360等。

Go語言是做什么的

應用于搭建 Web 服務器,存儲集群或類似用途的巨型中央服務器的系統(tǒng)編程語言。

Go 是谷歌的編程語言,而不是社區(qū)的。在這位博主看來,雖然 Go 語言擁有一個貢獻者社區(qū),但是它并不是社區(qū)的項目,只是谷歌的一個項目。所以只要是谷歌反對的東西,沒有人可以把這個東西加到 Go 語言中。

InfoQ 記者也第一時間聯系了《Go 并發(fā)編程實戰(zhàn)》作者、前輕松籌大數據負責人郝林,他的觀點是:Go 語言是大家的,只有偽愛好者才會談舍棄。在郝林看來,Go 語言官方團隊在谷歌內部實屬一個很小的團隊,但其成員幾乎個個都是技術大神。

很多社區(qū)成員為 Go 語言貢獻了很多重要并且有價值的東西,這些從貢獻者和提交者的多樣性就可以看出來。但谷歌作為整個 Go 社區(qū)的守門人,它獨自決定什么東西可以被 Go 語言接受,什么不能被接受。

在 Go 語言模塊系統(tǒng)上發(fā)生的一件事情,谷歌 Go 語言核心團隊的一名成員放棄了由外部 Go 社區(qū)開發(fā)的一個模塊系統(tǒng),因為它使用了另一種不同的模型。Go 語言擁有一個貢獻者社區(qū),但是它并不是一個社區(qū)項目。

網站欄目:go語言大佬 go語言入門指南
網站路徑:http://www.2m8n56k.cn/article34/ddgoope.html

成都網站建設公司_創(chuàng)新互聯,為您提供全網營銷推廣、網站建設、網站維護、小程序開發(fā)、微信小程序、營銷型網站建設

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都定制網站建設
主站蜘蛛池模板: 国产第三区 | 亚洲第一页在线 | 女人扒开双腿让男人捅 | 美国欧美一级毛片 | 色本道| 久久亚洲国产中v天仙www | 日日摸日日碰夜夜97 | 欧洲亚洲一区二区三区 | 99视频在线免费观看 | 亚洲人成网站色7799在线观看 | 国产高清视频免费在线观看 | 性感美女视频免费网站午夜 | 国产成人精品视频在放 | 日韩欧美成末人一区二区三区 | 免费91最新地址永久入口 | 国语自产精品视频 | 中文日韩字幕一区在线观看 | 日韩精品一区二区三区中文在线 | 欧美一区二三区 | 久久精品无遮挡一级毛片 | 欧美在线观看视频一区 | 欧美激情久久久久久久久 | 亚洲欧美日韩高清综合678 | 国产亚洲自拍一区 | 国产一级一片 | 鸥美毛片 | 激情宗合| 亚洲在线视频观看 | 老司机一级片 | 欧美成人精品一级高清片 | 91成人网 | 成人免费午夜性视频 | 91色老99久久九九爱精品 | 国产日韩欧美精品一区二区三区 | 欧美成人免费网在线观看 | 欧美大胆a | 欧美另类自拍 | 精品96在线观看影院 | 日韩国产欧美在线观看一区二区 | 精品xxxxxbbbb欧美中文 | 欧美一级毛片欧美一级成人毛片 |