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

Golang的协程调度器GMP

目录

GMP 含义

设计策略

全局队列

P的本地队列

GMP模型以及场景过程 

场景一

场景2 

场景三

场景四

场景五

场景六


GMP 含义

协程调度器,它包含了运行协程的资源,如果线程想运行协程,必须先获取P,P中还包含了可运行的G队列。以P 为主体 运行调度逻辑

设计策略

复用线程:避免频繁的创建、销毁线程,而是对线程的复用。

1 work stealing机制

        当本线程无可运行的G时,尝试从其他线程绑定的P偷取G,而不是销毁线程。

2 hand off机制

        当本线程因为G进行系统调用阻塞时,线程释放绑定的P,把P转移给其他空闲的线程执行。

利用并行:

GOMAXPROCS设置P的数量,最多有GOMAXPROCS个线程分布在多个CPU上同时运行。GOMAXPROCS也限制了并发的程度,

比如GOMAXPROCS = 核数/2,则最多利用了一半的CPU核进行并行。

抢占:

在coroutine中要等待一个协程主动让出CPU才执行下一个协程,

在Go中,一个goroutine最多占用CPU 10ms,防止其他goroutine被饿死,

这就是goroutine不同于coroutine的一个地方。

全局G队列:

在新的调度器中依然有全局G队列,当P的本地队列为空时,优先从全局队列获取,如果全局队列为空时则通过work stealing机制从其他P的本地队列偷取G。

全局队列

全局队列(Global Queue):存放等待运行的G。出队和入队时,都需要加锁,因为是临界资源

P的本地队列

P的本地队列:同全局队列类似,存放的也是等待运行的G,存的数量有限,不超过256个。

新建G 时,G优先加入到P的本地队列,如果队列满了,会把本地队列中一半的G移动到全局队列

GMP模型以及场景过程 

场景一

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

场景2 

G1运行完成后(函数:goexit),M上运行的goroutine切换为G0,G0负责调度时协程的切换

从P的本地队列取G2,从G0切换到G2,并开始运行G2。实现了线程M1的复用。

场景三

当一个协程开辟太多的协程后,如果本地队列已经满了,把协程顺序打乱后,让一半的协程加入到全局队列中

负载均衡(把P1中本地队列中前一半的G,还有新创建G转移到全局队列)

场景四

负载均衡后,再创建协程,可以加入到本地队列

场景五

规定:在创建G时,运行的G会尝试唤醒其他空闲的P和M组合去执行。

拿的话至少从全局队列取1个g,但每次不要从全局队列移动太多的g到p本地队列,给其他p留点。

这是从全局队列到P本地队列的负载均衡

场景六

全局队列已经没有G,那m就要执行work stealing(偷取):

从其他有G的P哪里偷取一半G过来,放到自己的P本地队列。

P2从P1的本地队列尾部取一半的G,本例中一半则只有1个G4,放到P2的本地队列并执行。

为什么新的协程要加入到本地队列呢? 

缓存局部性:协程在执行过程中可能会访问某些数据或资源。将它们放在 P 的本地队列中有助于保持缓存局部性即相关的数据或资源更有可能保留在 CPU 缓存中,从而减少了访问延迟。

文章思路来自 : 刘丹冰老师 Golang修养之路

相关文章:

Golang的协程调度器GMP

目录 GMP 含义 设计策略 全局队列 P的本地队列 GMP模型以及场景过程 场景一 场景2 场景三 场景四 场景五 场景六 GMP 含义 协程调度器,它包含了运行协程的资源,如果线程想运行协程,必须先获取P,P中还包含了可运行的G…...

C++ 后端,Vue前端

参考2篇博客 1-VUE、C前后端调用 2-Vue解决CORS header ‘Access-Control-Allow-Origin’ missing及同源、跨域问题 这里给出App.vue代码 <script setup lang"ts"> import HelloWorld from ./components/HelloWorld.vueimport axios from axios import { ref…...

使用Navicat Premium向mysql插入2000000条数据

DELIMITER // DROP PROCEDURE IF EXISTS sys_log; CREATE PROCEDURE sys_log() BEGIN DECLARE n int DEFAULT 1; WHILE(n<2000000) DO INSERT INTO sys_log VALUES (n, 超级系统管理员, 查询实时工况数据, /keyParameterMonitoring/getNewestUnitData, {\"role\"…...

docker命令记录

基本命令和参数 docker run: 运行一个新的容器实例。-itd: 组合参数&#xff0c;含义如下&#xff1a; -i: 以交互模式运行容器&#xff0c;保持标准输入打开。-t: 分配一个伪终端。-d: 后台运行容器&#xff0c;即使容器启动后依然返回控制台。 设备映射 --device/dev/dri…...

Java学习七

Java包 String对象 String案例 集合 ArrayList 集合...

麒麟Kylin | 操作系统的安装与管理

以下所使用的环境为&#xff1a;VMware Workstation 17 Pro、Kylin-Server-10-SP2-x86-Release-Build09-20210524 一、创建虚拟机 在VMware主机单击【创建新的虚拟机】 **在新建虚拟机向导中选择【自定义】&#xff0c;然后点击【下一步】 ** 保持默认选项&#xff0c;然后…...

数据结构预备知识(Java):包装类泛型

1、包装类 1.1 包装类 在Java中&#xff0c;每一个基本数据类型都有一个对应的包装类&#xff1a; 在SE的学习中我们已有过简单了解。 我们可以注意到&#xff0c;除了int类型的包装类为Integer&#xff0c;char类型的包装类为Character外&#xff0c;其余基本类型的包装类均…...

掌握Linux Vim:从基础到高级的全面指南

Vim是一款在Linux世界中备受推崇的文本编辑器,它以其强大的功能和高效的操作模式闻名于世。尽管Vim的学习曲线较陡,但一旦掌握,你将发现它在代码编辑和文本处理方面的无与伦比的优势。本文将从Vim的基础知识开始,逐步深入到高级用法和技巧,帮助你全面掌握这款强大的编辑器…...

打好“组合拳”,实现国有企业降本增效

在当前经济不确定性加剧、市场寒意明显的背景下&#xff0c;众多国有企业因历史积累的管理问题而陷入困境。随着经济形势的严峻&#xff0c;各行业普遍出现发展乏力的现象&#xff0c;促使企业开始重视“修炼内功”、“向内挖潜”&#xff0c;试图控制成本&#xff0c;以确保平…...

四川古力未来科技有限公司抖音小店解锁电商新机遇

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度蓬勃发展。四川古力未来科技有限公司紧跟时代步伐&#xff0c;积极拥抱变革&#xff0c;在抖音平台上开设小店&#xff0c;为品牌发展注入了新的活力。那么&#xff0c;四川古力未来科技有限公司抖音小店究竟…...

Maven之介绍

目录 一、简介 &#xff08;2&#xff09;为什么学习Maven&#xff1f; 二、小结 一、简介 &#xff08;1&#xff09;Maven 是一个 Java 项目管理和构建工具。它可以定义项目结构、项目依赖&#xff0c;并使用统一的方式进行自动化构建&#xff0c;是Java项目不可缺少的工具…...

简单了解java中的File类

1、File类 1.1、概述 File对象就表示一个路径&#xff0c;可以是文件路径也可以是文件夹路径&#xff0c;这个路径可以 是存在的&#xff0c;也可以是不存在的。 1.2、常见的构造方法 方法名称说明public File&#xff08;String pathname&#xff09;根据文件路径创建文件…...

边缘检测(一)-灰度图像边缘检测方法

灰度图像边缘检测是数字图像处理与机器视觉中经常遇到的一个问题&#xff0c;边缘检测是否连续、光滑是判断检测方法优劣的一个重要标准&#xff0c;下面通过一个实例提供灰度图像边缘检测方法&#xff0c;该方法对其他图像检测也具有一定的参考价值。 首先&#xff0c;读入一幅…...

2025计算机毕业设计选题题目推荐-毕设题目汇总大全

选题在于精&#xff0c;以下是推荐的容易答辩的选题&#xff1a; SpringBoot Vue选题: 基于SpringBoot Vue家政服务系统 基于SpringBoot Vue非物质文化遗产数字化传承 基于SpringBoot Vue兽医站管理系统 基于SpringBoot Vue毕业设计选题管理系统 基于SpringBoot Vue灾害应急救援…...

简易版 | 代码生成器(包含插件)

一、代码生成器 先导入依赖 <!-- Mybatis-Plus --> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.6</version> </dependency><!-- 代码生成器 --…...

【Python】Redis数据库

Redis数据库 Unit01一、Redis1.1 概述1.2 安装1.3 Redis-cli1.4 数据类型1.5 字符处理1.6 键的命名规则 二、通用命令三、字符串(String)3.1 概述3.2 常用命令3.3 应用场景 四、列表(List)4.1 概述4.2 常用命令 五、集合(SET)5.1 概述5.3 常用命令 六、有序集合6.1 概述6.2 常用…...

理解并应用:JavaScript响应式编程与事件驱动编程的差异

背景介绍 在现代JavaScript开发中&#xff0c;响应式编程&#xff08;Reactive Programming&#xff09;和事件驱动编程&#xff08;Event-Driven Programming&#xff09;是两种非常重要且常用的编程范式。虽然它们都用于处理异步操作&#xff0c;但在理念和实现方式上存在显…...

第4天:用户认证系统实现

第4天&#xff1a;用户认证系统实现 目标 实现用户认证系统&#xff0c;包括用户注册、登录、登出和密码管理。 任务概览 使用Django内置的用户认证系统。创建用户注册和登录表单。实现用户登出和密码重置功能。 详细步骤 1. 使用Django内置的用户认证系统 Django提供了…...

PostgreSQL源码分析 —— FunctionScan

本文分析一下FunctionScan的源码&#xff0c;加深一下理解。以SELECT * FROM generate_series(2,4);为例进行分析。 postgrespostgres# SELECT * FROM generate_series(2,4);generate_series -----------------234 (3 rows)postgrespostgres# explain SELECT * FROM generate…...

数据结构-十大排序算法集合(四万字精讲集合)

前言 1&#xff0c;数据结构排序篇章是一个大的工程&#xff0c;这里是一个总结篇章&#xff0c;配备动图和过程详解&#xff0c;从难到易逐步解析。 2&#xff0c;这里我们详细分析几个具备教学意义和实际使用意义的排序&#xff1a; 冒泡排序&#xff0c;选择排序&#xff0c…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

鸿蒙中用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. 报告列表…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

js 设置3秒后执行

如何在JavaScript中延迟3秒执行操作 在JavaScript中&#xff0c;要设置一个操作在指定延迟后&#xff08;例如3秒&#xff09;执行&#xff0c;可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法&#xff0c;它接受两个参数&#xff1a; 要执行的函数&…...

云原生时代的系统设计:架构转型的战略支点

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、云原生的崛起&#xff1a;技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深&#xff0c;传统的 I…...

基于小程序老人监护管理系统源码数据库文档

摘 要 近年来&#xff0c;随着我国人口老龄化问题日益严重&#xff0c;独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长&#xff0c;随之而来的是日益突出的老年人问题&#xff0c;尤其是老年人的健康问题&#xff0c;尤其是老年人产生健康问题后&…...