从M、G、P三个维度理解GMP调度模型(go gmp调度)

从M、G、P三个维度理解GMP调度模型(go gmp调度)

在Go语言中,GMP调度模型是实现并发的重要手段之一。GMP调度模型的核心思想是将M(Machine)、G(Goroutine)和P(Processor)三个概念分离开来,通过调度器来协调它们之间的关系,从而实现高效的并发。

M(Machine)

M代表着操作系统中的线程,它是Go语言中的执行单位。在程序启动时,Go语言会创建一定数量的M,每个M都会绑定一个P。M的数量默认是CPU核心数,但是可以通过GOMAXPROCS环境变量来设置。

G(Goroutine)

Goroutine是Go语言中的轻量级线程,它可以与M一起调度执行。在程序中,我们可以通过关键字go来启动一个Goroutine,例如:

go func() {// 处理业务逻辑}()

在上面的例子中,我们使用Go关键字启动了一个Goroutine,并在其中执行业务逻辑。需要注意的是,Goroutine是由Go语言的运行时(runtime)进行调度的,而不是由操作系统进行调度,因此它具有轻量级、高效等特点。

P(Processor)

Processor是Go语言中的处理器,它负责将Goroutine分配给M执行。每个M都会绑定一个P,而P的数量可以通过runtime.NumCPU()来获取(不同于M的数量)。

从M、G、P三个维度理解GMP调度模型(go gmp调度)

调度器

调度器是GMP调度模型的核心,它负责将Goroutine分配给M执行,并在M的数量不足时创建新的M。调度器还可以将M从一个P转移到另一个P,以达到负载均衡的目的。

调度器的实现方式比较复杂,但是它的工作原理可以简单概括如下:

– 当一个Goroutine被启动时,它会被放入一个全局的运行队列中(称为全局队列)。

– 当一个M空闲时,它会从全局队列中获取一个Goroutine,并开始执行它。

– 当一个Goroutine阻塞时,它会被放入一个本地的等待队列中(称为本地队列)。

– 当一个M中的本地队列为空时,它会从全局队列中获取一批Goroutine,并将它们放入本地队列中。

– 当一个P中的本地队列为空时,它会从其他P中的本地队列中获取一批Goroutine,并将它们放入本地队列中。

– 当一个M执行时间过长时,调度器会中断它的执行,并将它的状态保存到一个全局的挂起队列中。下次该M被分配到执行时,它会从挂起队列中恢复状态,并继续执行。

– 当一个M执行的Goroutine数量达到一定阈值时,调度器会将它的状态保存到一个全局的休眠队列中。下次该M被分配到执行时,它会从休眠队列中恢复状态,并继续执行。

下面我们来看一个简单的示例,它通过启动多个Goroutine来计算斐波那契数列的值:

package mainimport "fmt"func main() {for i := 0; i < 10; i {go func() {fmt.Println(fib(40))}()}}func fib(n int) int {if n < 2 {return n}return fib(n-1) fib(n-2)}

在上面的例子中,我们启动了10个Goroutine,并在其中计算斐波那契数列的值。由于斐波那契数列的计算是CPU密集型的,因此这个程序会利用GMP调度模型来实现高效的并发。

注意事项

在使用GMP调度模型时,需要注意以下几点:

– 不要在Goroutine中阻塞或者进行长时间的计算,这会导致M被挂起或者休眠,从而影响程序的性能。

– 不要在Goroutine中访问共享资源时不加锁,这会导致数据竞争,从而引发难以排查的bug。

– 不要将过多的Goroutine放入全局队列中,这会导致调度器的性能下降,从而影响程序的性能。

– 不要将过多的M创建出来,这会导致系统资源的浪费,从而影响程序的性能。

从M、G、P三个维度理解GMP调度模型(go gmp调度)

#从今天起记录我的2023#

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年8月1日 上午10:09
下一篇 2023年8月1日 上午10:25

相关推荐

  • Android一键脱壳工具 Xposed插件(安卓一键脱壳工具)

    Android一键脱壳工具 Xposed插件(安卓一键脱壳工具) 介绍 Android一键脱壳工具 Xposed插件 (必须获取root权限) 特性 支持Android4.0至7….

    科研百科 2024年3月28日
    53
  • 山东:下好项目建设“三步棋”实现全周期管理

    脱贫攻坚期间,山东省实施产业扶贫项目2.56万个,形成扶贫资产233 亿元,累计实现扶贫收益42亿元,为促进贫困群众稳定增收、壮大农村集体经济发挥了重要作用。脱贫攻坚任务完成后,工…

    2022年7月18日
    185
  • 任务管理器

    任务管理器是操作系统中非常重要的一部分,可以帮助用户监视系统资源使用情况,及时发现并解决潜在的问题。本文将介绍如何使用任务管理器来更好地管理计算机系统。 任务管理器是操作系统中一个…

    科研百科 4天前
    0
  • 管理员工考勤的软件叫什么(管理员工考勤的软件)

    管理员工考勤的软件 随着现代企业的快速发展,员工考勤管理已经成为了企业管理中不可或缺的一部分。如何有效地管理员工考勤,确保员工按时出勤,已经成为了许多企业管理者需要考虑的问题。今天…

    科研百科 2024年6月7日
    50
  • 科研项目预算调整理由

    科研项目预算调整的理由 随着科技的不断进步,科研项目也不断地发展和扩展。然而,随着项目的不断增加,预算也变得越来越庞大。因此,定期对科研项目预算进行调整是非常重要的。 其中,最常见…

    科研百科 2024年10月3日
    115
  • 新中国成立三十年的科技成就(建国以来三十年的科研项目)

    自建国以来,中国的科研项目经历了三十年的发展,取得了巨大的成就。这些项目涵盖了各个领域,包括自然科学、工程技术、社会科学和文化艺术等。在三十年的发展历程中,中国的科研领域不断拓展,…

    科研百科 2024年8月3日
    48
  • 科技项目项目中止有什么影响

    科技项目项目中止有什么影响 科技项目项目中止会对科技公司和项目团队产生深远的影响。在这篇文章中,我们将探讨科技项目项目中止的原因以及这些影响。 首先,科技项目项目中止可能会导致公司…

    科研百科 2024年10月11日
    14
  • “灯塔-党建在线”综合管理服务平台

    灯塔-党建在线:数字化管理助力党建工作 随着数字化时代的到来,党建领域的数字化管理已经成为必然趋势。灯塔-党建在线综合管理服务平台则是其中的一个重要组成部分。该平台是为了提高党建工…

    科研百科 2024年10月5日
    22
  • 会议管理系统java课程设计(java会议管理系统)

    Java会议管理系统: 高效会议管理解决方案 随着现代社交和商务活动的不断增多,会议管理的需求也越来越强烈。传统的手动记录和管理方式已经无法满足现代会议管理的需要,因此,开发一种高…

    科研百科 2024年6月2日
    52
  • kml格式轨迹文件导入奥维或户外助手(kml文件导入奥维地图)

    这篇文章只讲别人分享的kml格式轨迹文件的导入,奥维和户外助手本身自带分享功能,但是只能针对已经加好友的情况,而且不能跨软件分享。 如何使用奥维或户外助手,以后有时间在写一篇,百度…

    科研百科 2024年8月7日
    29