Go语言学习:GOMAXPROCS与G/M/P模型

需积分: 43 124 下载量 154 浏览量 更新于2024-08-10 收藏 1.7MB PDF 举报
"Go语言学习笔记,涵盖G, M, P模型,GOMAXPROCS的设置与工作原理,以及G和M的创建流程。" Go语言是Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的语言,特别适合构建高并发的服务。在Go中,我们经常会遇到三个关键的概念:Goroutine(G)、Worker Thread(M)和Processor(P)。这些概念是Go运行时系统的关键组成部分,用于管理并发执行。 Goroutine,简称G,是Go语言中的轻量级线程,由Go运行时自动调度。它们的开销非常小,允许程序创建大量并发任务而不会过度消耗资源。Goroutines之间的切换通常比操作系统线程更快,因为它们在用户空间进行调度。 Worker Thread,简称M,代表操作系统的线程。M是Go运行时与操作系统交互的实体,负责执行Goroutine并管理内存分配。每个M都必须关联一个P才能执行G。 Processor,简称P,是Go运行时的抽象处理器。P的数量与`GOMAXPROCS`环境变量设置的值相同,用于控制并发执行的粒度。P管理着一个G队列,当M需要执行G时,它会从P的队列中获取G。 `GOMAXPROCS`是一个重要的环境变量,用于设置可以同时执行的CPU核心数。默认值为1,意味着默认情况下,Go程序只使用一个CPU核心。你可以通过`runtime.GOMAXPROCS()`函数来改变这个值。例如,`runtime.GOMAXPROCS(2)`将设置为2个并发线程,而`runtime.GOMAXPROCS(0)`则会返回当前设置的值。 Go运行时的初始化过程中,会创建两个默认的Goroutine:一个是`main`,执行`main.main()`入口函数;另一个是`scavenger`,用于执行内存回收任务`MHeap_Scavenger`。 G和M的创建流程在Go运行时的`newproc1`函数中体现。这个函数负责创建一个新的Goroutine,并将其绑定到一个可用的M上。在创建Goroutine时,会为其分配栈空间,设置函数调用参数等。 Go语言的学习笔记持续更新,包含了从基础语法到高级特性的各种内容,如接口、方法、反射、包管理和标准库的使用,还有性能测试和调试技巧等。随着时间的推移,作者不断修订和完善笔记,以适应Go语言的版本更新和技术发展。 Go语言的并发模型是其强大之处,G、M、P三者协同工作,使得Go能够高效地处理并发任务。理解这些概念对于编写高效的Go代码至关重要。