首頁  >  文章  >  golang線程和協程有什麼區別

golang線程和協程有什麼區別

DDD
DDD原創
2023-06-16 13:14:071073瀏覽

golang執行緒與協程的區別:1、調度方式不同,執行緒是根據CPU時間片進行搶佔式調度的,協程由go語言執行時間調度器進行調度;2、調度策略不同,執行緒搶佔式調度,協程協作式調度;3、上下文切換速度不同,執行緒切換速度大約為1到2微秒,協程切換速度大約為0.2微秒左右;4、堆疊的大小不同,執行緒的棧大小一般為8MB,go協程堆疊大小預設為2KB。

golang線程和協程有什麼區別

本文操作環境:Windows10系統、go1.20版本、dell g3電腦。

golang執行緒與協程的差異:

1.調度方式

執行緒: 執行緒是根據CPU時間片進行搶佔式調度的。作業系統透過中斷訊號(定時器中斷、I/O設備中斷等)執行線程的上下文切換。當發生執行緒上下文切換時,需要從作業系統使用者態轉移到核心態,並保存狀態資訊;當切換到下一個要執行的執行緒時,需要載入狀態資訊並從核心態轉移到作業系統用戶態。

協程: 協程存在於使用者態,由go語言執行時間調度器進行調度。協程從屬於某一個線程,多個協程可以調度到一個線程中,一個協程也可能切換到多個線程中執行,因此協程與線程是多對多(M:N)的關係。

2.調度策略

#執行緒: 搶佔式調度。作業系統調度器為了均衡每個執行緒的執行週期,會定時發出中斷訊號強制執行執行緒上下文切換。

協程: 協作式調度。一個協程處理完自己的任務後,可以主動將執行權限讓渡給其他協程,不會輕易搶佔。只有在協程運作了過長時間後,go語言調度器才會強制搶佔其執行。

3.上下文切換速度

#線程: 執行緒上下文的切換需要經過作業系統用戶態與核心態的切換,切換速度大約是1~2微秒。

協程: 協程屬於用戶態輕量級的線程,協程的切換不需要經過用戶態與內核態的切換,且切換時只需要保存極少的狀態值,因此切換速度快數倍,約0.2微秒左右。 (大約10倍於執行緒的切換速度)

4.堆疊的大小

執行緒: 執行緒的堆疊大小一般是在建立時指定的,linux及mac上預設的堆疊大小一般為8MB(可以透過ulimit -s檢視)。 2000個執行緒需要消耗16G虛擬記憶體。

協程: go協程堆疊大小預設為2KB, 16G虛擬記憶體可以創建800多萬個協程。在實踐中,經常可以看到有成千上萬的協程。

以上是golang線程和協程有什麼區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn