golang协程特点
? ? ? ?協(xié)程特點(diǎn):
? ? ? 用戶空間 避免了內(nèi)核態(tài)和用戶態(tài)的切換導(dǎo)致的成本。
? ? ? 可以由語言和框架層進(jìn)行調(diào)度。
? ? ? 更小的棧空間允許創(chuàng)建大量的實(shí)例
?
? ? ??
Golang中的Goroutine的特性:
Golang內(nèi)部有三個對象: P對象(processor) 代表上下文(或者可以認(rèn)為是cpu),M(work thread)代表工作線程,G對象(goroutine).
正常情況下一個cpu對象啟一個工作線程對象,線程去檢查并執(zhí)行g(shù)oroutine對象。碰到goroutine對象阻塞的時候,會啟動一個新的工作線程,以充分利用cpu資源。 所有有時候線程對象會比處理器對象多很多.
?
G(Goroutine) :我們所說的協(xié)程,為用戶級的輕量級線程,每個Goroutine對象中的sched保存著其上下文信息.
M(Machine) :對內(nèi)核級線程的封裝,數(shù)量對應(yīng)真實(shí)的CPU數(shù)(真正干活的對象).
P(Processor) :即為G和M的調(diào)度對象,用來調(diào)度G和M之間的關(guān)聯(lián)關(guān)系,其數(shù)量可通過GOMAXPROCS()來設(shè)置,默認(rèn)為核心數(shù).
在單核情況下,所有Goroutine運(yùn)行在同一個線程(M0)中,每一個線程維護(hù)一個上下文(P),任何時刻,一個上下文中只有一個Goroutine,其他Goroutine在runqueue中等待。
一個Goroutine運(yùn)行完自己的時間片后,讓出上下文,自己回到runqueue中(如下圖所示)。
當(dāng)正在運(yùn)行的G0阻塞的時候(可以需要IO),會再創(chuàng)建一個線程(M1),P轉(zhuǎn)到新的線程中去運(yùn)行
總結(jié)
以上是生活随笔為你收集整理的golang协程特点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSP并发模型
- 下一篇: Golang中常用的并发模型