Golang GMP原理(2)

这篇具有很好参考价值的文章主要介绍了Golang GMP原理(2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

GMP调度场景

场景1

P拥有G1,M1获取P后开始运行G1,G1使用 go func 创建G2,为了局部性G2优先加入到P1的本地队列
Golang GMP原理(2)

场景2

G1运行完成后(函数:goexit),M上运行的goroutine切换为G0,G0负责调度时协程的切换(函数:schedule)。从P的本地队列取G2,从G0切换到G2,并开始运行G2(函数:execute)。实现了线程M1的复用。
Golang GMP原理(2)

场景3

G2在创建G7的时候,发现P1的本地队列已满,需要执行负载均衡(把P1中本地队列中前一半的G,还有新创建G转移到全局队列)
Golang GMP原理(2)

场景4

G2创建G8时,P1的本地队列未满,所以G8会被加入到P1的本地队列。G8加入到P1点本地队列的原因还是因为P1此时在与M1绑定,而G2此时是M1在执行。所以G2创建的新的G会优先放置到自己的M绑定的P上。
Golang GMP原理(2)

场景5

在创建G时,运行的G会尝试唤醒其他空闲的P和M组合去执行。假定G2唤醒了M2,M2绑定了P2,并运行G0,但P2本地队列没有G,M2此时为自旋线程(没有G但为运行状态的线程,不断寻找G)。
Golang GMP原理(2)

场景6

M2尝试从全局队列(简称“GQ”)取一批G放到P2的本地队列(函数:findrunnable())。M2从全局队列取的G数量符合下面的公式:n = min(len(GQ)/GOMAXPROCS + 1, len(GQ/2))

至少从全局队列取1个g,但每次不要从全局队列移动太多的g到p本地队列,给其他p留点。这是从全局队列到P本地队列的负载均衡
Golang GMP原理(2)

场景7

假设G2一直在M1上运行,经过2轮后,M2已经把G7、G4从全局队列获取到了P2的本地队列并完成运行,全局队列和P2的本地队列都空了

全局队列已经没有G,那m就要执行work stealing(偷取):从其他有G的P哪里偷取一半G过来,放到自己的P本地队列。P2从P1的本地队列尾部取一半的G,本例中一半则只有1个G8,放到P2的本地队列并执行。
Golang GMP原理(2)

场景8

G1本地队列G5、G6已经被其他M偷走并运行完成,当前M1和M2分别在运行G2和G8,M3和M4没有goroutine可以运行,M3和M4处于自旋状态,它们不断寻找goroutine。为什么要让m3和m4自旋,自旋本质是在运行,线程在运行却没有执行G,就变成了浪费CPU. 为什么不销毁现场,来节约CPU资源。因为创建和销毁CPU也会浪费时间,我们希望当有新goroutine创建时,立刻能有M运行它,如果销毁再新建就增加了时延,降低了效率。当然也考虑了过多的自旋线程是浪费CPU,所以系统中最多有GOMAXPROCS个自旋的线程(当前例子中的GOMAXPROCS=4,所以一共4个P),多余的没事做线程会让他们休眠。
Golang GMP原理(2)

场景9

假定当前除了M3和M4为自旋线程,还有M5和M6为空闲的线程(没有得到P的绑定,注意我们这里最多就只能够存在4个P,所以P的数量应该永远是M>=P, 大部分都是M在抢占需要运行的P),G7创建了G9,G7进行了阻塞的系统调用,M2和P2立即解绑,P2会执行以下判断:如果P2本地队列有G、全局队列有G或有空闲的M,P2都会立马唤醒1个M和它绑定,否则P2则会加入到空闲P列表,等待M来获取可用的p。本场景中,P2本地队列有G9,可以和其他空闲的线程M5绑定。
Golang GMP原理(2)

场景10

G7创建了G9,假如G7进行了非阻塞系统调用。M2和P2会解绑,但M2会记住P2,然后G7和M2进入系统调用状态。当G7和M2退出系统调用时,会尝试获取P2,如果无法获取,则获取空闲的P,如果依然没有,G7会被记为可运行状态,并加入到全局队列,M2因为没有P的绑定而变成休眠状态(长时间休眠等待GC回收销毁)。
Golang GMP原理(2)文章来源地址https://www.toymoban.com/news/detail-437225.html

到了这里,关于Golang GMP原理(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从零开始的PICO教程(2)--搭建VR场景并打包至PICO中运行

    在开发VR游戏的时候, 第一个要解决的问题就是PICO环境配置 ,为了验证自己的环境配置是否正确,这里以能否打包到PICO 上运行为标准。衡量你们的环境配置是否正确,向注定波澜壮阔的虚拟世界发出一声:Hello World!WoW! 1、大纲 经过该教程你将学会 如何搭建一个简单的场

    2024年02月03日
    浏览(91)
  • 【Jvm】运行时数据区域(Runtime Data Area)原理及应用场景

    Jvm由 4个部分 组成,分为2个子系统和2个组件 ,2个子系统为 Class loader(类装载)、Execution engine(执行引擎) ;2个组件为 Runtime Data Area(运行时数据区)、Native Interface(本地接口) 。 Class loader(类加载器) :根据给定的全限定名类名(如:Java.lang.Object)来装载class文件到Runtime data area中的

    2024年02月20日
    浏览(50)
  • 『从零开始』拥有一台服务器并搭建java开发环境

      各位小伙伴们大家好,欢迎来到这个小扎扎的博客,本篇博客中将会和大家分享如何购买甚至白嫖一台属于你自己的服务器(当然这台服务器会有时间限制),服务器到手之后就是服务器的设置以及常规java开发的环境搭建,以上内容在本篇博客中都会作详细讲解   首

    2024年01月19日
    浏览(59)
  • Go For Web:一篇文章带你用 Go 搭建一个最简单的 Web 服务、了解 Golang 运行 web 的原理

    本文作为解决如何通过 Golang 来编写 Web 应用这个问题的前瞻,对 Golang 中的 Web 基础部分进行一个简单的介绍。目前 Go 拥有成熟的 Http 处理包,所以我们去编写一个做任何事情的动态 Web 程序应该是很轻松的,接下来我们就去学习了解一些关于 Web 的相关基础,了解一些概念,

    2023年04月14日
    浏览(51)
  • 【golang】调度系列之m

    调度系列 调度系列之goroutine 调度系列之P 调度系列之sysmon 调度系列之整体介绍 上一篇中介绍了goroutine,最本质的一句话就是goroutine是用户态的任务。我们通常说的goroutine运行其实严格来说并不准确,因为任务只能 被 执行。那么goroutine是被谁执行呢?是被m执行。 在GMP的架构

    2024年02月09日
    浏览(39)
  • 从源码角度看 Golang 的调度

    G:代表一个 goroutine,每个 goroutine 都有自己独立的栈存放当前的运行内存及状态。可以把一个 G 当做一个任务。 M: 代表内核线程(Pthread),它本身就与一个内核线程进行绑定,goroutine 运行在 M 上。 P:代表一个处理器,可以认为一个“有运行任务”的 P 占了一个 CPU 线程的资源

    2024年02月13日
    浏览(40)
  • 在CSDN学Golang云原生(Kubernetes Pod调度)

    在 Kubernetes 中,可以使用 NodeSelector 字段来指定 Pod 调度到哪些节点上运行。NodeSelector 是一个键值对的 map,其中键是节点的标签名,值是标签值。具体步骤如下: 在节点上添加标签 首先需要在节点上添加相应的标签,例如: 编写 Pod 的 YAML 文件 在编写 Pod 的 YAML 文件时,需

    2024年02月15日
    浏览(41)
  • k8s调度场景

    Kubernetes调度是确保集群中的Pod在适当节点上运行的关键组件。通过灵活配置调度策略,可以提高资源利用率、负载平衡和高可用性。 在本文中,我们将深入探讨一些实际的Kubernetes调度场景,并提供相应的配置示例和最佳实践。 场景描述:我们有一些标记有SSD硬盘的节点,并

    2024年04月17日
    浏览(31)
  • AI绘图原理:让机器也拥有绘画的灵魂

    在人工智能技术的发展过程中,计算机视觉是其中最为重要的一个方向。而图像生成作为计算机视觉的一个分支,也逐渐成为人们关注的焦点之一。近年来,随着神经网络技术的发展,人工智能在图像生成领域的研究也取得了显著进展。本文将围绕AI绘图原理进行详细阐述。

    2024年02月01日
    浏览(45)
  • Golang的API项目快速开始

    开启一个简单的API服务。 golang的教程网上一大堆,官网也有非常详细的教程,这里不在赘述这些基础语法教程,我们意在快速进入项目开发阶段。 golang好用语法教程传送门: m.runoob.com/go/ 编写第一个API 前提:按照上一篇文档初始化项目 1. 下载gin框架,一个非常好用的写A

    2024年01月21日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包