Skip to main content
 首页 » 操作系统 » linux系统

Golang是单线程模型还是多线程模型?

直接的回答是:Golang是基于多线程模型的。

Golang有一个环境变量GOMAXPROCS,决定了Go运行库最多会启动几个线程来运行goroutine。

但在Golang中没有线程的概念,用的是协程,即goroutine。

先看一下进程、线程、协程这几个概念:

进程:分配完整独立的地址空间,拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程的切换只发生在内核态,由操作系统调度。

线程:和其它本进程的线程共享地址空间,拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程的切换一般也由操作系统调度。

协程:和线程类似,共享堆,不共享栈,协程的切换由Go的调度器来进行调度。

所以,一个Go程序是一个进程,进程里有数个线程,进程里还有数个协程,一个或几个协程对应一个线程。

讲解GO线程模型的一般用这样几个符号:

M: OS线程

P: goroutin所必须的上下文环境

G: goroutin

调度器: 管理和调度 M, P, G

从关系上可以看下图:

Golang是单线程模型还是多线程模型?  Golang 第1张

一个OS线程和一个上下文绑定,一个上下文可以挂几个协程,由Go调度器来分配、调度他们。

评论列表暂无评论
发表评论
微信