深入理解 Go 调度模型 GPM

Author mogd 2022-04-28
Update mogd 2022-05-05
Adage Be content with what you have; rejoice in the way things are. When you realize there is nothing lacking, the whole world belongs to you.

深入理解 Go 调度模型 GPM

Go 语言中最大的一个特性就是天生支持并发,而这一功能体现的就是其调度模型 GPM,那么在了解 Go 调度模型 GPM 之前,需要先了解一下并发 (concurrency) 与并行 (parallesim) 的区别

前言

并发和并行最开始都是操作系统中的概念,表示的是CPU执行多个任务的方式,但这是两个不同的概念

并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行

并行:当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)

这里有一个很重要的一个点,并行是需要系统有多个 CPU 才会出现

举个例子:

你同时跟多名女生聊天,在这个过程看似同时完成的,但是其实你是在不同的聊天之间来回切换的
反过来,多名女生同时跟你聊天,多个女生之间可以在同一个时间点发信息,之间是互不影响的

并发其实是一段时间内宏观上多个程序同时运行,而并行是指同一时刻,多个任务真的在同时运行

工作负载 (Workloads)

在考虑并发时,有两种类型的工作负载需要知道:

  • CPU-Bound: 永远不会造成 Goroutines 自然地进入和退出等待状态的情况。这是一项不断进行计算的工作。将 Pi 计算到第 N 位的线程将受 CPU 限制
  • IO-Bound: 一种导致 Goroutines 自然进入等待状态的工作负载。包括通过网络请求访问资源,或对操作系统进行系统调用,或等待事件发生;需要读取文件的 Goroutine 即是 IO-Bound;包括同步事件(互斥体、原子),它们会导致 Goroutine 作为此类的一部分等待

对于 CPU-Bound 工作负载,需要并行性来利用并发性; 对于 IO-Bound 工作负载,不需要并行性即可使用并发性

总结

并发指定是多个事情,在同一个时间段内同时发生了,多个任务之间是互相抢占资源的

并行是指多个事情,在同一个时间点同时发生了,任务之间不互相抢占资源

一、调度模型 GPM

G、P、M 是 Go 调度器的三个核心组件,是 Go 语言天然支持高并发的内在动力

Go 调度器的工作是在一个或多个处理器上运行的多个工作操作系统线程上分发可运行的 goroutine。在多线程计算中,调度出现了两种范式:工作共享和工作窃取

  • 工作共享:当一个处理器生成新线程时,它会尝试将其中的一些线程迁移到其他处理器,希望它们被空闲/未充分利用的处理器使用
  • 工作窃取:未充分利用的处理器主动寻找其他处理器的线程并“窃取”一些

1.1 什么是 GPM

G 是 goroutine 的缩写,保存 goroutine 的一些状态信息 (执行的函数指令及参数,G 保存的任务对象,线程上下文切换,现场保护和现场恢复) 以及 CPU 的一些寄存器的值,相当于操作系统中的进程控制块

<
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值