当前位置: 首页 > news >正文

Golang-GMP

GMP调度


golang-GMP语雀笔记整理

  • GMP调度
    • 设计目的,为何设计GMP?
    • GMP的底层实现
      • 几个核心数据结构
      • GMP调度流程

设计目的,为何设计GMP?

无论是多进程、多线程目的都是为了并发提高cpu的利用率,但多进程、多线程都存在局限性。比如多进程通过时间轮片等调度方式实现宏观上并发,但进程间资源独立,切换开销大,多线程虽然共享内存不需要内存页表的切换,但还是涉及到用户态、内核态的切换,权级的切换开销是最大的。 所以多进程,多线程存在切换开销大、高内存占用的问题; 想进一步提高cpu的高利用率,需要避免内核介入,权级的切换,所以协程就是这样实现的,它相当于用户态的线程,操作都在用户态下进行,对内核透明更加轻量。 协程与线程 为 M:1 的关系,M:1存在问题M个协程在同一个线程上进行,无法实现并行。 所以问题归根起来就是:实现一个好的调度器,能很好的处理M个协程映射到N个线程上。golang通过GMP模型实现这种调度。

GMP的底层实现

几个核心数据结构

G是golang对协程的抽象,如下图:核心字段gobuf是g的运行信息(gobuf的运行信息能保障这个goroutine由于系统调用之外的其他调度而暂停时,下次调度到的时候能恢复执行,里面存了包括堆栈指针SP等信息), *m是运行当前g的m(动态绑定的)。 g的状态:waiting、runable、running、dead等
G要绑定到P上才能执行,在G的视角里P是CPU;
image.png
M是golang对线程的抽象,M不直接执行G,而是由P作为代理,M无需跟G绑定,也无需记录G的状态信息,因此G在生命周期中可以跨线程M执行;在m结构体中有一个g0调度协程,执行g之间的切换调度,不执行用户函数,与M为1:1;TLS中保存当前执行g的信息,这个信息保存能保证M在唤醒的时候能执行休眠之前的goroutine(当然,如果M跟着G一起休眠,大概率是因为G由于系统调用而阻塞,G的其他的3种调度类型比如主动调度、被动调度、正常调度都在用户态下,并不会导致M休眠)
image.png

P是golang的调度器,对G来说P是CPU,对M来说P是代理,为M提供可执行的G;数据结构主要是一个256长度的P本地队列,队头指针,队尾指针,以及一个runnext指针,这个指针指向下一个可执行的goroutine(这个指针在维护局部性的时候有用到)
image.png

schedt全局队列
全局任务队列加锁,记录长度
image.png

GMP调度流程

GMP调度流程主要体现在g0gg0的循环中

  1. g0执行schedule()函数寻找可执行的g;

  2. g0执行execute()函数,更新g的状态信息,调用gogo()方法,将执行权交给g

  3. g因为4种调度方式调用m_call函数,把执行权重新交给g0;

  4. g0重新schedule()寻找可执行的g;

  5. g0调用schedule()寻找可执行g的细节:调用了findRunable()方法,在这个方法中,每寻找61次g都会在全局队列中取一个g(防止全局队列中的G饿死),否则就正常从p的本地队列中取,如果本地队列空了,就加锁到全局队列中取,全局队列也没有就通过workstrealing机制去其他P中尝试获取一半,这个过程是4次尝试,并且通过随机因子寻找P,一定程度上保证了公平性,窃取完后会调整目标P的队首指针;

  6. 更新g的状态信息,比如修改g的m为当前m,而后g获得执行权,开始执行任务

  7. g执行任务时,有4中调度方式会导致执行权回到g0的手里,主动调度(用户调用shced方法)、被动调度(不满足执行条件,比如管道阻塞、没有获得锁等,调用g_park()后g进入waiting态,可通过g_read()唤醒)、正常完成(G的任务完成)、抢占调度(G发起系统调用,导致进入阻塞,这时的阻塞是进入到了内核态,因为G发起的系统调用是以M的身份发起的,此时M也是僵直的,所以g0是无法感知到的,所以抢占调度其实是需要一个监控协程来完成的,这个协程越过p直接跟M绑定。 此时阻塞的G跟M绑定,监控协程会把P抽离出来,找一个M重新跟P绑定)

所以整个流程可以描述为
image.png

相关文章:

Golang-GMP

GMP调度 golang-GMP语雀笔记整理 GMP调度设计目的,为何设计GMP?GMP的底层实现几个核心数据结构GMP调度流程 设计目的,为何设计GMP? 无论是多进程、多线程目的都是为了并发提高cpu的利用率,但多进程、多线程都存在局限性。比如多进程通过时…...

【PythonWeb开发】Flask自定义模板路径和静态资源路径

在大型的 Flask 项目中,确实可能会有多个子应用(Blueprints),每个子应用可能都有自己的静态文件和模板。为了更好地管理和组织这些资源,可以使用static_folder 和template_folder 属性来统一管理。必须同时设置好主应用…...

Java对象创建过程

在日常开发中,我们常常需要创建对象,那么通过new关键字创建对象的执行中涉及到哪些流程呢?本文主要围绕这个问题来展开。 类的加载 创建对象时我们常常使用new关键字。如下 ObjectA o new ObjectA();对虚拟机来讲首先需要判断ObjectA类的…...

Does a vector database maintain pre-vector chunked data for RAG systems?

题意:一个向量数据库是否为RAG系统维护预向量化分块数据? 问题背景: I believe that when using an LLM with a Retrieval-Augmented Generation (RAG) approach, the results retrieved from a vector search must ultimately be presented…...

Rust-11-错误处理

Rust 将错误分为两大类:可恢复的(recoverable)和 不可恢复的(unrecoverable)错误。对于一个可恢复的错误,比如文件未找到的错误,我们很可能只想向用户报告问题并重试操作。不可恢复的错误总是 b…...

自动化测试:使用Postman进行接口测试与脚本编写

Postman 是一种流行的 API 测试工具,广泛应用于开发和测试过程中。它不仅可以用于手动测试,还支持自动化测试和脚本编写,以确保 API 的可靠性和性能。本文将详细介绍如何使用 Postman 进行接口测试与脚本编写,帮助你更高效地进行自…...

ONLYOFFICE 8.1 桌面编辑器测评:引领数字化办公新潮流

目录 前言 下载安装 新功能概述 1.PDF 编辑器的改进 2. 演示文稿中的幻灯片版式 3.语言支持的改进 4. 隐藏“连接到云”板块 5. 页面颜色设置和配色方案 界面设计:简洁大方,操作便捷 性能评测:稳定流畅,高效运行 办公环…...

基于大语言模型LangChain框架:知识库问答系统实践

ChatGPT 所取得的巨大成功,使得越来越多的开发者希望利用 OpenAI 提供的 API 或私有化模型开发基于大语言模型的应用程序。然而,即使大语言模型的调用相对简单,仍需要完成大量的定制开发工作,包括 API 集成、交互逻辑、数据存储等…...

解锁Transformer的鲁棒性:深入分析与实践指南

🛡️ 解锁Transformer的鲁棒性:深入分析与实践指南 Transformer模型自从由Vaswani等人在2017年提出以来,已经成为自然语言处理(NLP)领域的明星模型。然而,模型的鲁棒性——即模型在面对异常、恶意或不寻常…...

mybatis#号和$区别

在MyBatis中,#{}和${}都是用于实现动态SQL的占位符,但它们在使用场景和安全性上有明显的区别: 用途区别: #{}主要用于传递接口传输过来的具体数据,如参数值,它可以防止SQL注入,因为MyBatis会…...

AI绘画 Stable Diffusion【实战进阶】:图片的创成式填充,竖图秒变横屏壁纸!想怎么扩就怎么扩!

大家好,我是向阳。 所谓图片的创成式填充,就是基于原有图片进行扩展或延展,在保证图片合理性的同时实现与原图片的高度契合。是目前图像处理中常见应用之一。之前大部分都是通过PS工具来处理的。今天我们来看看在AI绘画工具 Stable Diffusio…...

Linux内核 -- 汇编结合ko案例之PMU获取cpu cycle技术

ARMv7汇编实现周期计数读取与清空 本文档详细描述了如何在ARMv7平台上使用汇编语言编写周期计数器读取与清空函数,如何在内核模块中导出这些函数供其他模块调用,以及如何使用Netlink接口供用户态程序进行调用。 1. 汇编函数实现 首先,编写…...

探索 Symfony 框架:工作原理、特点及技术选型

目录 1. 概述 2. Symfony 的工作原理 2.1 MVC 架构 2.2 前端控制器模式 2.3 路由机制 2.4 依赖注入容器 2.5 事件驱动架构 3. Symfony 的特点 3.1 高度可扩展性 3.2 强大的社区支持和生态系统 3.3 优秀的性能和可伸缩性 3.4 严格的代码规范和最佳实践 4. Symfony …...

从万里长城防御体系看软件安全体系建设@安全历史03

长城,是中华民族的一张重要名片,是中华民族坚韧不屈、自强不息的精神象征,被联合国教科文组织列入世界文化遗产名录。那么在古代,长城是如何以其复杂的防御体系,一次次抵御外族入侵,而这些防御体系又能给软…...

ISO 19110操作要求类中的/req/operation/formal-definition详细解释

/req/operation/formal-definition 要求: 每个要素操作实体必须具有一个形式定义(formal definition),该定义应明确描述操作的行为和影响。 具体解释 定义 要素操作实体(feature operation entity):这…...

豆包大语言模型API调用错误码一览表

本文介绍了您可能从 API 和官方 SDK 中看到的错误代码。 http code说明 400 原因:错误的请求,例如缺少必要参数,或者参数不符合规范等 解决方法:检查请求后重试 401 原因:认证错误,代表服务无法对请求进…...

AI辅助设计:如何通过机器学习革新创意工作流程

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师、爬虫、ACM算法,大数据,深度学习 💒 公众号…...

轻松解锁电脑强悍性能,4000MHz的玖合星舞 DDR4 内存很能打

轻松解锁电脑强悍性能,4000MHz的玖合星舞 DDR4 内存很能打 哈喽小伙伴们好,我是Stark-C~ 很多有经验的电脑玩家在自己DIY电脑选购内存条的时候,除了内存总容量,最看重的参数那就是频率了。内存频率和我们常说的CPU主频一样&…...

SpringBoot | 使用jwt令牌实现登录认证,使用Md5加密实现注册

对于登录认证中的令牌,其实就是一段字符串,那为什么要那么麻烦去用jwt令牌?其实对于登录这个业务,在平常我们实现这个功能时,可能大部分都是通过比对用户名和密码,只要正确,就登录成功&#xff…...

Springboot基于Redis的高性能分布式缓存数据库的实现与实例

一、引言 在现代的分布式系统和高并发应用中,缓存机制显得尤为重要。Redis作为一种开源(BSD许可)的内存键值存储,因其高性能、丰富的数据结构和多样化的应用场景,成为开发者们的首选。在这篇博客中,我们将…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...