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

Golang--协程调度

协程bilibiliGoroutine调度模型早期调度模型GgoroutineGo协程对应数据结构runtime.gMmachine工作线程对应数据结构runtime.m在程序地址空间的数据段中有重要的全局变量g0主协程对应的G。不同于其他的协程g0的协程栈在主线程栈上进行分配。m0主线程对应的M。allg用于记录所有的G。allm用于记录所有的M。g0和m0中都分别记录了对方的地址m0最开始的执行的协程就是g0。Golang的早期调度器中只有G和M所有的G被维护在一个全局队列中所有的M互斥地从全局队列中拿取G执行。但是多个M访问全局队列时频繁的加锁和解锁会导致M的等待影响程序并发性能。若G中进行了系统调用则OS会将对应的M阻塞则能够从全局队列中拿取G的M就少了代表执行能力变弱了。若全局队列中大部分G都会进行系统调用则就会让大部分M进入阻塞状态全局队列产生堆积。对于该问题需要对线程池中的M数量做把控太多了也会会由于多个线程抢占CPU反而导致执行能力下降。GMP模型在GM的基础上又引入了P。Pprocessor包含运行Go代码的必要资源也有调度goroutine的能力对应数据结构runtime.g每一个P中维护了一个自己的本地队列。代码段中添加有全局变量sched调度器其中记录了所有空闲的M和P以及全局队列等与调度相关的内容。allp保存了所有的P在调度器初始化时会根据GOMAXPROCS该环境变量决定创建多少个P保存于allp中并将第一个Pallp[0]与m0进行关联。将一个P关联到一个M该M就能从P的本地队列中获取G而不再只能从全局队列中去获取。若P的本地队列满了等待执行的G就会被放入全局队列。M会优先从P的本地队列拿取G执行若P的本地队列空了再到全局队列中拿取G若全局队列也空了M会从别的M关联的P中偷取一定的G进行分担一般一次偷取一半。GMP执行大致过程schedinit调度器初始化new main goroutine调用newproc函数创建main goroutine。newproc的参数为由用户指定调用的函数f即goroutine运行入口以及需要传入f的参数。newproc会为goroutine构造一个栈帧方便goroutine结束后调用goexit函数来进行协程的回收处理决定该goroutine是放回空闲G队列备用还是直接销毁。将main goroutine加入到allp[0]的本地队列中。mstart开启调度循环mstart是所有工作线程的入口主要通过调用schedule函数来执行调度循环。对于一个活跃的M要么是正在执行某个G要么是正在执行调度程序获取某个G。runtime.mainmian goroutine的执行入口其会创建监控线程初始化包等操作。其中包括调用main.main开始执行用户编写的语句。在main.main返回之后runtime.main会调用exit函数结束进程。假设我们执行的是以下代码packagemainimport(fmttime)funchello(){fmt.Println(Hello World)}funcmain(){gohello()time.Sleep(1*time.Second)}go hello()会调用newproc创建一个goroutine我们称为hello goroutine。若**GOMACPROCS**为1则hello goroutine会进入allp[0]的本地队列。time.Sleep会让main goroutine让到timer中进行等待。m0调用schedule函数进行调度让hello goroutine得以运行。当main goroutine的等待时间结束会被放入allp[0]的本地队列中。最后main goroutine结束m0调用exit结束进程。若**GOMACPROCS**1意味着不止有一个P则可能会启动新的线程来关联空闲的P。之后再将hello goroutine放入到空闲的这个P的本地队列中。GMP调度策略队列轮转P会将其本地队列中的G周期性地调度到M中执行执行一段时间将上下文保存放入队列尾部再从队列拿取一个G调度。每个P也会周期性地查看全局队列中是否有G待运行并将其调度到M中执行全局队列中的G主要来自于从系统调用中恢复的G。为了保证全局队列中的G不会被饿死故P会周期性查看全局队列。系统调用当某个M在执行的G中发生了系统调用该M会释放掉其关联的P由别的空闲的M来获取P继续执行P的本地队列中剩下的G。而之前的G发生系统调用结束后根据执行它的M是否能获取到P对该G进行不同的处理有空闲的P获取一个P继续执行G没有空闲的P将G放入全局队列等待被其他的P调度。M进入线程池休眠。

相关文章:

Golang--协程调度

协程 bilibili Goroutine调度模型 早期调度模型 G:goroutine,Go协程,对应数据结构:runtime.gM:machine,工作线程,对应数据结构:runtime.m 在程序地址空间的数据段中有重要的全局…...

Python模拟墨子号量子加密通信

一、前言 本文将从环境搭建、模块拆分、代码实现到测试验证,完整讲解如何基于本源量子云平台实现 BB84 量子密钥分发协议,涵盖本地模拟和真机调用两种模式,代码模块化设计,可直接复用,适合量子计算初学者快速上手。 …...

新能源动力总成台架试验室全面建设规划:动力电池、电机及电力电子件试验室布局与实施方案

新能源动力总成台架试验室能力建设规划,70页PPT 动力电池,电机,电驱动总成,其他控制器等电力电子件试验室建设"搞电池测试?先学会和BMS对话"——这是某次凌晨三点我在试验室改协议解析脚本时顿悟的真理。动力…...

从抱怨访问速率限制到建立完整镜像站,大厂在开源生态扩张中是否正在利用技术霸权扼杀初创项目的生存空间?

## 开源镜像站背后:大厂的技术扩张与初创项目的生存夹缝 最近在技术社区里,经常能看到一些关于开源项目访问速率限制的抱怨。比如某个知名的代码托管平台,突然对未登录用户或者免费账户的API调用次数做了严格限制,导致一些自动化脚…...

纯电动车动态跟随能量管理策略

纯电车动态跟随能量管理策略近年来,纯电动车(BEV)的普及速度越来越快,而如何有效管理车辆的能量使用,成为了提升驾驶体验和延长续航里程的关键问题。在城市道路中,纯电动车常常面临频繁的启停和加速减速的情…...

天心大师也谈浮躁的人工智能,当孟子遇见AI,仁义何在?

有关AI的伦理、价值与未来走向的讨论从未停歇。天心大师,今日也谈及了人工智能发展中所显现的“浮躁”之气,并提出了引人深思的命题:当两千多年前倡导“仁义礼智信”的孟子,遇见了以算法和数据驱动的现代AI,将会碰撞出…...

爆火的“小龙虾“OpenClaw:风口之下,别让便利埋了安全隐患

爆火的"小龙虾"OpenClaw:风口之下,别让便利埋了安全隐患写在开头一、顶流"小龙虾":凭什么刷爆全网?职场办公神器运维得力助手行业深度赋能二、急转直下!官方预警 企业禁令,风险彻底暴…...

基于单片机与矩阵按键的门禁系统Proteus仿真程序:密码验证与电磁锁控制

单片机1602矩阵按键 门禁系统Proteus仿真程序--------------------------------------------| 第1列 第2列 第3列 第4列 ||第1行 0 1 2 3 ||第2行 4 5 6 7 | 初始密码:1234…...

首次全年盈利,同比增长453%!寒武纪2025年报很亮眼

一张图解读版(来源寒武纪官微): 2025年,这家成立九年的智能芯片企业首次实现全年盈利,营收突破64亿元,净利润超过20亿元。这家曾被质疑能否存活的硬科技公司,用实打实的数据证明了自己的价值。 …...

显存暴降92%!哈工大为线性注意力开辟了新道路

2017年,Transformer模型横空出世,在自然语言处理领域掀起了AI革命。此后,视觉领域也迎来了Transformer的浪潮,从图像分类到目标检测,从语义分割到图像生成,注意力机制几乎渗透到了计算机视觉的每一个角落。…...

【LLM进阶-Agent】8. Reflexion Agent 介绍

深度解析 LLM Agent 演进:从 ReAct 到 Reflexion 的“自我反思”之路 在复杂任务场景下,业界早期广泛采用的是 ReAct (Reason Act) 范式。然而,在实际落地中我们常常发现:大模型像是一个固执且健忘的员工。当它陷入幻觉或采取错误…...

风光储并网控制系统的设计与Matlab Simulink仿真建模研究

风光储并网控制系统,Matlab/simulink仿真建模搞风光储并网控制系统仿真的人都知道,Simulink里那堆复杂的模块看着就头大。不过别慌,咱们今天用最糙的实操方式,手把手拆解这个系统。先来张全家福(不是让你真的拍照&…...

OpenClaw玩转有道云笔记

用通俗语言拆解工作逻辑和实操细节(每步校验、避坑提示),全程贴合新手视角,确保原理易懂、操作能直接落地,解决安装、配置、使用中的各类常见问题。 YoudaoNote Skills 是有道云笔记平台官方提供的OpenClaw插件(类似“功能扩展工具”),核心作用是“让 OpenClaw 能直接…...

小程序毕业设计-基于微信小程序的乡村治理数字化平台的设计与实现

基于微信小程序的乡村治理数字化平台的设计与实现技术说明: 用户前端:微信小程序原生框架 管理前端Vue.js 服务端(后端):基于java的Sprinboot框架 数据库:MySQL 功能说明: 小程序端 1.轮播图片 2.乡村资讯乡村快讯春耕播种政策服务预警信息 3.乡村服务-预约户籍办理婚姻登记土地…...

SAM2:使用mask作为提示输入,实现VOS视频分割

8k50o45u_seg目录 1. 引言 2. 使用SAM2实现VOS任务 2.1 数据集 2.2 主要函数 2.3 主要代码 3. 结果展示 1. 引言 本文尝试使用SAM2模型来实现VOS任务。由于在官方的github代码中只找到了point或者box作为提示,但是论文中却说明是可以输入mask作为提示的&#…...

vue+uniapp小程序Python美食菜品点餐订单系统

目录 技术选型与架构设计前端功能模块划分后端API开发关键实现细节测试与部署 项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 技术选型与架构设计 前端采用Vue.jsUniapp框架,实现跨平台小…...

Element Plus - 在 el-select 的每个选项右侧添加按钮

在 el-select 的每个选项右侧添加按钮 <el-select v-model"formData.encryptMethod" placeholder"请选择加密方式"><el-option v-for"item in encryptMethods" :key"item.value" :label"item.label" :value"i…...

C++编程法则365天(359)lamba是如何捕获变量

文章目录 一、Lambda捕获的核心前提:Lambda的本质是“匿名仿函数” 二、不同捕获方式的实现细节 1. 值捕获([x] 或 [=]) 2. 引用捕获([&x] 或 [&]) 3. 捕获this指针([this] 或 [=]/[&] 在类中) 4. 隐式捕获([=] 或 [&]) 5. C++14新增:初始化捕获([x…...

线性参变(LPV)+输出反馈鲁棒模型预测控制(OFRMPC)+路径跟踪(PTC)

线性参变(LPV)输出反馈鲁棒模型预测控制(OFRMPC)路径跟踪(PTC)&#xff0c;目前能实现20-25m/s的变速单移线&#xff0c;更多工况可自行调试。 考虑速度和侧偏刚度变化,以及质心侧偏角的鲁棒估计&#xff0c;基于二自由度模型和LMI设计输出反馈鲁棒模型预测控制器。 上层考虑输…...

双极板设计经验

1.气体流通方向在双极板中通常有流场的那一面朝里&#xff0c;双极板有出口和入口&#xff0c;气体通过这些垂直进出板子&#xff0c;然后在流场的沟内平行与板子迅速铺满整个流场&#xff0c;再通过流场的肋流向扩散层。2.出入口设计出口的总面积应略大于入口的总面积&#xf…...

Python基础分享:打印各种三角形和九九乘法表

学习编程时&#xff0c;循环和字符串操作是必须掌握的基础知识。通过打印简单的图形&#xff0c;我们可以直观地理解循环的逻辑、字符串的拼接以及格式化输出。本文将以Python为例&#xff0c;详细介绍如何打印正三角形、倒三角形、等腰三角形以及经典的九九乘法表&#xff0c;…...

深度优先搜索:从全排列到记忆化搜索

深度优先搜索&#xff08;DFS&#xff09;的进化之路&#xff1a;从全排列到记忆化搜索 在算法竞赛中&#xff0c;搜索算法是解决问题的基础。然而&#xff0c;面对不同类型的问题&#xff0c;选用错误的 DFS 模型不仅会导致超时&#xff08;TLE&#xff09;&#xff0c;还容易…...

技术深潜:从向量检索到语义对齐——解析天津市南开区天才群策科技有限责任公司的GEO工程化实践

技术前言&#xff1a;当企业营销遭遇模型黑盒 在CSDN的技术社区里&#xff0c;关于GEO的讨论早已从“是什么”转向了“怎么做”。随着各大AI平台算法的快速迭代&#xff0c;传统的SEO技术栈已全面失效。企业面临的核心矛盾在于&#xff1a;大模型的知识更新是非线性的&#xff…...

D3DCompiler_47.dll未被指定在Windows运行的问题解决办法

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…...

一文读懂OpenClaw!开源、可自托管的个人Agent平台

OpenClaw 是 2026 年备受关注的开源 AI Agent 平台&#xff0c;它并非普通的聊天 AI&#xff0c;而是 AI 智能 体理论的成熟工程化实践&#xff0c;不仅能聊天&#xff0c;更能帮你执行具体处理任务。想要用好这一工具&#xff0c;首先要厘清其底层的基础逻辑。 OpenClaw基础概…...

vue2和vue3使用less和scss

文章目录Vue 2 中使用 Less 和 SCSS一、安装依赖二、配置 vue.config.js三、在 .vue 文件中使用Vue 3 中使用 Less 和 SCSS一、安装依赖二、配置 vite.config.js三、在 .vue 文件中使用Vue 2和Vue 3使用差异样式穿透less、scss语法1、变量2、运算3、注释4、嵌套5、混入(Mixin)6…...

3.29不见不散

...

超越 Transformer 的架构前瞻

第六章&#xff1a;未来——超越 Transformer 的架构前瞻Transformer 的成功令人瞩目&#xff0c;但在工程和科学的世界里&#xff0c;没有任何架构是完美的。Transformer 有它的阿喀琉斯之踵&#xff0c;全球顶尖实验室正在积极探索下一代架构。这一章我们来剖析 Transformer …...

面试官最爱问的设计题:动态支付系统设计(策略模式 + 工厂模式 + Spring自动注册)

在 Java 面试中&#xff0c;有一道 非常经典的面向对象设计题&#xff1a;如何设计一个 支持多种支付方式的支付系统&#xff1f;例如&#xff1a;支付宝微信银行卡Apple Pay未来可能新增更多支付方式很多面试者第一反应就是写 if-else&#xff0c;但这其实是一个 典型的设计模…...

部署RHCSA9.7、并完成优化

一、建立虚拟机 1、初步建立 &#xff08;1&#xff09;点击创新的虚拟机 &#xff08;2&#xff09;点击自定义----下一步 &#xff08;3&#xff09;点击稍后安装操作系统----下一步 &#xff08;4&#xff09;点击Linux&#xff08;L&#xff09;----版本选择&#xff08;…...