golang中協程和執行緒的區別

2022-07-27 09:24:10 字數 322 閱讀 9300

一般來說,協程就像輕量級的執行緒。

執行緒一般有固定的棧,有乙個固定的大小。而goroutines為了避免資源浪費(亦或是資源缺乏),採用動態擴張收縮的策略:初始量為2k,最大可以擴張到1g。

執行緒和 goroutine 切換排程開銷方面

執行緒/goroutine 切換開銷方面,goroutine 遠比執行緒小

執行緒:涉及模式切換(從使用者態切換到核心態)、16個暫存器、pc、sp...等暫存器的重新整理等。

因為協程在使用者態由協程排程器完成,不需要陷入核心,這代價就小了。

所以goroutine:只有三個暫存器的值修改 - pc / sp / dx.

協程和執行緒的區別

棧容量,執行緒預設都是2m,這個固定值對於小型的方法來說有點浪費,而對於永遠大資料量的方法是遠遠不夠的。協程的棧初始大小是2k,很輕便,開銷不大,按需自動增長和減少棧記憶體。最大可以達到1gb.排程問題。執行緒的排程是由核心排程器來排程的,核心排程器每隔幾毫秒進行排程,終止當前執行緒,儲存其狀態,然...

關於協程 nodejs和golang協程的不同

nodejs和golang都是支援協程的,從表現上來看,nodejs對於協程的支援在於async await,golang對協程的支援在於goroutine。關於協程的話題,簡單來說,可以看作是非搶占式的輕量級執行緒。一句話概括,上面提到了 可以看作是非搶占式的輕量級執行緒 在多執行緒中,把一段 放...

Lua 協程和執行緒區別

協程就是協程,不是執行緒。cpu執行單位是執行緒,不是什麼協程。協程,是同步執行,不是並行,只是切了乙個上下文了,為你儲存原來的上下文而已。切到第二個協程時,原來的協程處於掛起狀態。這個特指lua的協程。unity的協程也是這麼回事。lua協程例子 local function run data p...