首頁>Club>
goroutinue是在一個執行緒中排程,還是在多個執行緒中排程?
12
回覆列表
  • 1 # 一分鐘說軟體

    直接的回答是:Golang是基於多執行緒模型的。

    Golang有一個環境變數GOMAXPROCS,決定了Go執行庫最多會啟動幾個執行緒來執行goroutine。

    但在Golang中沒有執行緒的概念,用的是協程,即goroutine。

    先看一下程序、執行緒、協程這幾個概念:

    程序:分配完整獨立的地址空間,擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,程序的切換隻發生在核心態,由作業系統排程。

    執行緒:和其它本程序的執行緒共享地址空間,擁有自己獨立的棧和共享的堆,共享堆,不共享棧,執行緒的切換一般也由作業系統排程。

    協程:和執行緒類似,共享堆,不共享棧,協程的切換由Go的排程器來進行排程。

    所以,一個Go程式是一個程序,程序裡有數個執行緒,程序裡還有數個協程,一個或幾個協程對應一個執行緒。

    講解GO執行緒模型的一般用這樣幾個符號:

    M: OS執行緒

    P: goroutin所必須的上下文環境

    G: goroutin

    排程器: 管理和排程 M, P, G

    從關係上可以看下圖:

    一個OS執行緒和一個上下文繫結,一個上下文可以掛幾個協程,由Go排程器來分配、排程他們。

  • 中秋節和大豐收的關聯?
  • 化妝常用的眼影種類有哪些?