首页 > 其他分享 >GMP模型

GMP模型

时间:2023-11-13 11:24:39浏览次数:28  
标签:模型 goroutine 调度 线程 内存 Go GMP OS

每一个 OS 线程都有一个固定大小的内存块(一般会是 2MB)来做栈,这个栈会用来存储当前正在被调用或挂起(指在调用其它函数时)的函数的内部变量。这个固定大小的栈同时很大又很小。因为 2MB 的栈对于一个小小的 goroutine 来说是很大的内存浪费,而对于一些复杂的任务(如深度嵌套的递归)来说又显得太小。因此,Go 语言做了它自己的线程。

在 Go 语言中,每一个 goroutine 是一个独立的执行单元,相较于每个 OS 线程固定分配 2M 内存的模式,goroutine 的栈采取了动态扩容方式, 初始时仅为 2KB,随着任务执行按需增长,最大可达 1GB(64 位机器最大是 1G,32 位机器最大是 256M),且完全由 golang 自己的调度器 Go Scheduler 来调度。

此外,GC 还会周期性地将不再使用的内存回收,收缩栈空间。 因此,Go 程序可以同时并发成千上万个 goroutine 是得益于它强劲的调度器和高效的内存模型。Go 的创造者大概对 goroutine 的定位就是屠龙刀,因为他们不仅让 goroutine 作为 golang 并发编程的最核心组件(开发者的程序都是基于 goroutine 运行的)而且 golang 中的许多标准库的实现也到处能见到 goroutine 的身影,比如 net/http 这个包,甚至语言本身的组件 runtime 运行时和 GC 垃圾回收器都是运行在 goroutine 上的,作者对 goroutine 的厚望可见一斑。

任何用户线程最终肯定都是要交由 OS 线程来执行的,goroutine(称为 G)也不例外,但是 G 并不直接绑定 OS 线程运行,而是由 Goroutine Scheduler 中的 P - Logical Processor (逻辑处理器)来作为两者的传递者,P 可以看作是一个抽象的资源或者一个上下文,一个 P 绑定一个 OS 线程.

在 golang 的实现里把 OS 线程抽象成一个数据结构:M,G 实际上是由 M 通过 P 来进行调度运行的,但是在 G 的层面来看,P 提供了 G 运行所需的一切资源和环境,因此在 G 看来 P 就是运行它的 “CPU”,由 G、P、M 这三种由 Go 抽象出来的实现,最终形成了 Go 调度器的基本结构:

G: 表示 Goroutine,每个 Goroutine 对应一个 G 结构体,G 存储 Goroutine 的运行堆栈、状态以及任务函数,可重用。G 并非执行体,每个 G 需要绑定到 P 才能被调度执行。

P: Processor,表示逻辑处理器, 对 G 来说,P 相当于 CPU 核,G 只有绑定到 P(在 P 的 local runq 中)才能被调度。对 M 来说,P 提供了相关的执行环境(Context),如内存分配状态(mcache),任务队列(G)等,P 的数量决定了系统内最大可并行的 G 的数量(前提:物理 CPU 核数 >= P 的数量),P 的数量由用户设置的 GOMAXPROCS 决定,但是不论 GOMAXPROCS 设置为多大,P 的数量最大为 256。

M: Machine,OS 线程抽象,负责调度任务, 代表着真正执行计算的资源,在绑定有效的 P 后,进入 schedule 循环;而 schedule 循环的机制大致是从 Global 队列、P 的 Local 队列以及 wait 队列中获取 G,切换到 G 的执行栈上并执行 G 的函数,调用 goexit 做清理工作并回到 M,如此反复。M 并不保留 G 状态,这是 G 可以跨 M 调度的基础,M 的数量是不定的,由 Go Runtime 调整,为了防止创建过多 OS 线程导致系统调度不过来,目前默认最大限制为 10000 个。

标签:模型,goroutine,调度,线程,内存,Go,GMP,OS
From: https://www.cnblogs.com/qcy-blog/p/17828737.html

相关文章

  • SEM :验证模型
    验证模型是SEM中至关重要的一步,它帮助确定我们提出的理论模型是否与实际观察到的数据相一致。验证模型的过程通常包括以下几个步骤:设定假设(HypothesisSpecification):在建立SEM之前,我们首先要明确定义我们的假设,即变量之间的关系。这些假设形成了我们将要验证的理论模型。模......
  • AI毕业设计生成器(基于AI大模型技术开发)
    这是一个辅助生成计算机毕业设计的工具,可以自动完成毕业设计的源码。它基于几百个github上面开源的java和python项目,运用tengsorflow技术,训练出了AI大模型。基本实现了计算机毕业设计生成器,能够初步生成Java或python基本源码。目前该项目处理实验阶段,还不成熟。体验地址https:......
  • 倾斜摄影三维模型的根节点合并的点云抽稀关键技术分析
    倾斜摄影三维模型的根节点合并的点云抽稀关键技术分析 倾斜摄影三维模型的根节点合并是指将多个倾斜摄影拍摄得到的点云数据进行抽稀操作,以减少点云数据量和提高数据处理效率。在处理大规模的倾斜摄影点云数据时,点云抽稀是一个关键的技术,它可以有效地降低数据存储需求、加速数......
  • Odoo模型_联系人相关
    res.partner(联系人)联系人包括客户的公司以公司的员工、供应商的公司以及公司的员工。res.partner.category(联系人标签)用于给联系的人打标签,也是树形结构,可以设置上级标签,类似产品中的产品类。res.partner.title(联系人称谓)当联系人为个人或者是公司下面的......
  • Odoo模型_产品相关
    product.template(产品模板)product.product(产品变体)product.attribute(产品属性)预设产品变体的属性,包括尺码、颜色等。product.template.attribute.line(产品属性明细)产品属性明细就是产品属性的值可以预设几种,用来选择,结合产品属性生成变体。product.category(......
  • 惯性导航中的噪声模型
    惯性导航中的噪声模型惯性导航中,常用的噪声模型有四种:**高斯白噪声**、**随机游走**、**一阶马尔科夫过程**和**随机常值**。在IMU器件手册中,噪声通常用角度随机游走angularrandomwalk(ARW)和速率随机游走velocityrandomwalk(VRW)来表示。下面分别进行说明:一、高斯白噪声1.1......
  • 计算机图形:光照模型
    目录基本概念光源彩色光源点光源无穷远光源环境光辐射强度衰减方向光源、投射效果角强度衰减表面光照效果基本光照模型环境光Lambert漫反射模型Phong模型(镜面反射)光强与RGB颜色亮度透明表面光折射简单透明模型参考基本概念光照明模型(illuminationmodel):对场景的对象进行透视投影......
  • 开源多模态模型—MiniGPT-5,多模态生成的突破
    在人工智能领域,多模态生成已成为科技巨头争相突破的前沿。而MiniGPT-5模型,由加州大学圣克鲁斯分校研发,提出了全新的“GenerativeVokens”概念,创新性地构建了文本与图像特征空间的桥梁,推动了普通训练数据的有效对齐,同时生成高质量的文本和图像。MiniGPT-5的核心技术:GenerativeVoke......
  • pytorch实现感知机模型
    感知机是一种简单的二分类模型,通常用于线性分类任务。以下是使用PyTorch和Python实现感知机模型的示例代码,并附有注释。pythonimporttorchimporttorch.nnasnnimporttorch.optimasoptimimportmatplotlib.pyplotaspltimportnumpyasnp#生成一些随机的线性......
  • CSS3学习笔记-盒模型
    CSS盒模型是指包含内容(content)、填充(padding)、边框(border)和外边距(margin)几个方面的一个矩形框模型。内容区(content):指元素中显示内容的区域,它的大小由width和height属性决定。填充区(padding):用于控制内容区周围的空白区域或边距,padding属性可以控制填充区的大小。边框(border):位于......