直接的回答是:Golang是基於多執行緒模型的。
Golang有一個環境變數GOMAXPROCS,決定了Go執行庫最多會啟動幾個執行緒來執行goroutine。
但在Golang中沒有執行緒的概念,用的是協程,即goroutine。
先看一下程序、執行緒、協程這幾個概念:
程序:分配完整獨立的地址空間,擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,程序的切換隻發生在核心態,由作業系統排程。
執行緒:和其它本程序的執行緒共享地址空間,擁有自己獨立的棧和共享的堆,共享堆,不共享棧,執行緒的切換一般也由作業系統排程。
協程:和執行緒類似,共享堆,不共享棧,協程的切換由Go的排程器來進行排程。
所以,一個Go程式是一個程序,程序裡有數個執行緒,程序裡還有數個協程,一個或幾個協程對應一個執行緒。
講解GO執行緒模型的一般用這樣幾個符號:
M: OS執行緒
P: goroutin所必須的上下文環境
G: goroutin
排程器: 管理和排程 M, P, G
從關係上可以看下圖:
一個OS執行緒和一個上下文繫結,一個上下文可以掛幾個協程,由Go排程器來分配、排程他們。
直接的回答是:Golang是基於多執行緒模型的。
Golang有一個環境變數GOMAXPROCS,決定了Go執行庫最多會啟動幾個執行緒來執行goroutine。
但在Golang中沒有執行緒的概念,用的是協程,即goroutine。
先看一下程序、執行緒、協程這幾個概念:
程序:分配完整獨立的地址空間,擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,程序的切換隻發生在核心態,由作業系統排程。
執行緒:和其它本程序的執行緒共享地址空間,擁有自己獨立的棧和共享的堆,共享堆,不共享棧,執行緒的切換一般也由作業系統排程。
協程:和執行緒類似,共享堆,不共享棧,協程的切換由Go的排程器來進行排程。
所以,一個Go程式是一個程序,程序裡有數個執行緒,程序裡還有數個協程,一個或幾個協程對應一個執行緒。
講解GO執行緒模型的一般用這樣幾個符號:
M: OS執行緒
P: goroutin所必須的上下文環境
G: goroutin
排程器: 管理和排程 M, P, G
從關係上可以看下圖:
一個OS執行緒和一個上下文繫結,一個上下文可以掛幾個協程,由Go排程器來分配、排程他們。