最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

文字解說Golang Goroutine和線程的區(qū)別

 更新時(shí)間:2022年03月23日 09:18:33   作者:頭禿貓輕王  
goroutine 是 Go語言中的輕量級(jí)線程實(shí)現(xiàn),由 Go 運(yùn)行時(shí)(runtime)管理,使用每一個(gè) go 關(guān)鍵字將會(huì)額外開啟一個(gè)新的協(xié)程 goroutine,今天通過本文給大家介紹下Golang Goroutine和線程的區(qū)別,感興趣的朋友一起看看吧

Golang Goroutine和線程的區(qū)別 Golang,輕松學(xué)習(xí)

一、Golang Goroutine?

當(dāng)使用者分配足夠多的任務(wù),系統(tǒng)能自動(dòng)幫助使用者把任務(wù)分配到 CPU 上,讓這些任務(wù)盡量并發(fā)運(yùn)作。這種機(jī)制在 Go語言中被稱為 goroutine。

goroutine 是 Go語言中的輕量級(jí)線程實(shí)現(xiàn),由 Go 運(yùn)行時(shí)(runtime)管理。Go 程序會(huì)智能地將 goroutine 中的任務(wù)合理地分配給每個(gè) CPU。

使用每一個(gè) go 關(guān)鍵字將會(huì)額外開啟一個(gè)新的協(xié)程 goroutine

二、線程是什么?

線程(英語:thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。

三、調(diào)度的區(qū)別

1.線程調(diào)度

線程是系統(tǒng)調(diào)度的基本單位,線程作為調(diào)度與分配的基本單位,線程切換,僅需保存和設(shè)置少量寄存器的內(nèi)容,開銷遠(yuǎn)小于進(jìn)程開銷。但這種線程切換仍然需要一個(gè)完整的上下文切換:即保存一個(gè)線程的狀態(tài)到內(nèi)存,再恢復(fù)另外一個(gè)線程的狀態(tài),最后更新調(diào)度器的數(shù)據(jù)結(jié)構(gòu)。某種意義上,這種操作還是很慢的。

2.goroutine 調(diào)度

Go運(yùn)行的時(shí)候包涵一個(gè)自己的調(diào)度器,這個(gè)調(diào)度器使用一個(gè)稱為一個(gè)M:N調(diào)度技術(shù),m個(gè)goroutine到n個(gè)os線程(可以用GOMAXPROCS來控制n的數(shù)量),Go的調(diào)度器不是由硬件時(shí)鐘來定期觸發(fā)的,而是由特定的go語言結(jié)構(gòu)來觸發(fā)的,他不需要切換到內(nèi)核語境,所以調(diào)度一個(gè)goroutine比調(diào)度一個(gè)線程的成本低很多。
Goroutine協(xié)程是一種協(xié)作任務(wù)控制機(jī)制,Goroutine可以理解為一種Go語言的協(xié)程。同時(shí)它可以運(yùn)行在一個(gè)或多個(gè)線程上。而Goroutine協(xié)程的切換一般由程序員在代碼中顯式控制。它避免了上下文切換的額外耗費(fèi),兼顧了多線程的優(yōu)點(diǎn),簡(jiǎn)化了高并發(fā)程序的復(fù)雜。

四、??臻g的區(qū)別

1.線程占用

每個(gè)OS的線程都有一個(gè)固定大小的棧內(nèi)存,通常是2MB,棧內(nèi)存用于保存在其他函數(shù)調(diào)用期間哪些正在執(zhí)行或者臨時(shí)暫停的函數(shù)的局部變量。這個(gè)固定的棧大小,如果對(duì)于goroutine來說,可能是一種巨大的浪費(fèi)。
以 64位環(huán)境的 JVM 為例,會(huì)默認(rèn)固定為每個(gè)線程分配 1MB ??臻g,如果大小分配不當(dāng),便會(huì)出現(xiàn)棧溢出的問題。

2.goroutine 占用

- goroutine 所占用的內(nèi)存,均在棧中進(jìn)行管理 - goroutine 所占用的??臻g大小,由 runtime 按需進(jìn)行分配 goroutine在生命周期開始只有一個(gè)很小的棧,典型情況是2KB, 在go程序中,一次創(chuàng)建十萬左右的goroutine也不罕見(2KB*100,000=200MB)。而且goroutine的棧不是固定大小,它可以按需增大和縮小,最大限制可以到1GB。 goroutine 相較于線程更加輕量,關(guān)鍵點(diǎn)就在于??臻g的動(dòng)態(tài)分配,這樣便可以最大限度的利用內(nèi)存資源。

五、標(biāo)識(shí)的區(qū)別

1.線程標(biāo)識(shí)

在大部分支持多線程的操作系統(tǒng)和編程語言中,線程有一個(gè)獨(dú)特的標(biāo)識(shí),通常是一個(gè)整數(shù)或者指針,這個(gè)特性可以讓我們構(gòu)建一個(gè)線程的局部存儲(chǔ),本質(zhì)是一個(gè)全局的map,以線程的標(biāo)識(shí)作為鍵,這樣每個(gè)線程可以獨(dú)立使用這個(gè)map存儲(chǔ)和獲取值,不受其他線程干擾。

2.goroutine 標(biāo)識(shí)

goroutine中沒有可供程序員訪問的標(biāo)識(shí),原因是一種純函數(shù)的理念,不希望濫用線程局部存儲(chǔ)導(dǎo)致一個(gè)不健康的超距作用,即函數(shù)的行為不僅取決于它的參數(shù),還取決于運(yùn)行它的線程標(biāo)識(shí)。

總結(jié)

Golang 通過復(fù)雜的協(xié)程操作來實(shí)現(xiàn)我們的并發(fā)需求,golang是用戶線程與系統(tǒng)線程的對(duì)應(yīng)關(guān)系是多對(duì)多,既能利用多核cpu資源,也能盡可能減少上下文切換成本,代價(jià)是go需要實(shí)現(xiàn)復(fù)雜的goroutine調(diào)度機(jī)制。
相比于N:1時(shí)所有用戶線程對(duì)應(yīng)1個(gè)系統(tǒng)線程,無法利用多核cpu;1:1時(shí)1個(gè)用戶線程對(duì)應(yīng)一個(gè)系統(tǒng)線程,上下文切換成本高。通過復(fù)雜的調(diào)度實(shí)現(xiàn)N:N時(shí),即能利用多核cpu資源,也能盡可能減少上下文切換成本,成為Go語言最為人知的特點(diǎn),天生支持高并發(fā)與高效。

到此這篇關(guān)于Golang Goroutine和線程的區(qū)別的文章就介紹到這了,更多相關(guān)Golang Goroutine和線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

韩城市| 陇西县| 阿图什市| 象山县| 元朗区| 齐齐哈尔市| 淮阳县| 达孜县| 永靖县| 闻喜县| 景德镇市| 荔波县| 天全县| 大竹县| 六盘水市| 柞水县| 余庆县| 祁东县| 祁阳县| 原阳县| 武平县| 依兰县| 图木舒克市| 连南| 梁平县| 南通市| 芷江| 衡阳市| 故城县| 嘉黎县| 襄汾县| 彭山县| 漠河县| 牟定县| 沛县| 小金县| 上虞市| 陕西省| 张家川| 婺源县| 长沙县|