回覆列表
  • 1 # 上官憐雲

    3.1 概念

    在go程式中,由輕量級執行緒實現,由Go執行時(runtime)管理。

    3.2 與程序、執行緒的區別

    1)程序擁有自己獨立的堆疊,既不共享堆,也不共享棧。是由作業系統排程的。

    2)執行緒擁有自己獨立的棧和共享的堆,共享堆,不共享棧,是由作業系統排程。

    2)協程共享堆,不共享棧,協程是由程式設計師在協程的程式碼中顯示排程。

    3.3 主執行緒和協程的關係

    3.4 協程比執行緒輕量的原因

    3.4.1 執行緒併發的流程

    執行緒是核心對外提供的服務,應用程式可以透過系統呼叫讓核心啟動執行緒,由核心來負責執行緒的排程和切換。執行緒在等待I/O操作時執行緒變為unrunnable狀態會觸發上下文切換。現代作業系統一般都採用搶佔式排程,上下文切換一般發生在時鐘中斷和系統呼叫返回前,排程器計算當前執行緒的時間片,如果需要切換就從佇列中選出一個目標執行緒,儲存當前執行緒的環境,並且恢復目標執行緒的執行環境,最典型的就是切換ESP指向目標執行緒核心堆疊,將EIP指向目標執行緒上次被排程出時的指令地址。

    3.4.2 協程併發的流程

    不依賴作業系統和其提供的執行緒,golang自己實現的CSP併發模型:M,P,G

    go協程也叫使用者態執行緒,協程之間的切換髮生在使用者態。在使用者態沒有時鐘中斷、系統呼叫等機制,因此效率高。

    3.5 go協程佔用記憶體少的原因

    執行go協程只需要極少的棧記憶體(大概4~5KB),預設情況下,執行緒棧的大小為1MB。

    goroutine就是一段程式碼,一個函式入口,以及在堆上分配的一個堆疊。所以我們可以輕鬆建立上萬個goroutine,但他們並不是被作業系統排程執行的。

  • 2 # 使用者6991634322172

    在Go語言中,協程的英文名是gorutine,它常常被用於進行多工。在Go語言中,沒有執行緒的概念,故不會透過多執行緒來進行併發。

  • 中秋節和大豐收的關聯?
  • 你有多喜歡羽毛球?