深入探讨Go语言协程调度:GRM模型解析与优化策略

news2024/11/27 5:53:42

一、线程调度

1、早期单线程操作系统
  • 一切的软件都是跑在操作系统上,真正用来干活(计算)的是 CPU
  • 早期的操作系统每个程序就是一个进程,直到一个程序运行完,才能进行下一个进程,就是“单进程时代”
  • 一切的程序只能串行发生

2、多进程/线程时代 
  • 在多进程/多线程的操作系统中,就能解决了阻塞的问题,因为一个进程阻塞 cpu 可以立刻切换到其他进程中去执行
  • 而且调度 cpu 的算法可以保证在运行的进程都可以被分配到 cpu 的运行时间片
  • 这样从宏观来看,似乎多个进程是在同时被运行
  • 但新的问题就又出现了,进行拥有太多的资源,进程的创建、切换、销毁、都会占用很长的时间
  • CPU 虽然利用起来了,但如果进程过多,CPU 有很大的一部分都被用来进行进程调度了
  • 大量的进程/线程都出现了新的问题
    • 高内存占用
    • 调度的高消耗 CPU
    • 进程虚拟内存会占用 4GB[32位操作系统],而线程也要大约 4MB

3、Go 协程 goroutine 
  • Go 中,协程被称为 goroutine,它非常轻量,一个 goroutine 只占几 KB,并且这几 KB 就足够 goroutine 运行完
  • 这就能在有限的内存空间内支持大量 goroutine;支持了更多的并发
  • 虽然一个 goroutine 的栈只占几 KB,但实际是可伸缩的,如果需要更多内容,runtime 会自动为 goroutine 分配
  • Goroutine 特点:
    • 占用内存更小(几 KB)
    • 调度更灵活(runtime 调度)
4、协程域线程区别
  • 协程跟线程是有区别的,线程由 CPU 调度是抢占式的
  • 协程由用户调度是协作式的,一个协程让出 cpu 后,才执行下一个协程

二、调度器 GMP 模型

  • G:goroutine(协程)
  • M:thread(内核线程,不是用户态线程)
  • P:processer(调度器) 
1、GM 模型
  • G(协程)通常在代码里用 go 关键字执行一个方法,那么就等于起了一个 G
  • M(内核线程)操作系统内核其实看不见 G 和 P,只知道自己在执行一个线程
  • G 和 P 都是在用户层上的实现
  • 并发量小的时候还好,当并发量大了,这把大锁,就成了性能瓶颈

  • GMP 由来
    • 基于没有什么是加一个中间层不能解决的思路,golang在原有的GM的基础上加入了一个调度器P
    • 可以简单理解为是在G和M中间加了个中间层
    • 于是就有了现在的GMP模型里的P
2、GMP模型

三、GMP流程分析 

  • 我们通过go func()来创建一个goroutine
1、P本地队列获取G
  • M想要运行G,就要先获取P,然后从P的本地队列获取G

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

3、从其他P本地队列的G放到自己P队列
  •  如果全局队列为空时,M会从其他P的本地队列偷(stealing)一半G放到自己P的本地队列

4、M从P获取下一个G,不断重复
  • M运行G,G执行之后,M会从P获取下一个G,不断重复下去

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1295899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据可视化:解锁企业经营的智慧之道

在现代企业管理中,数据可视化已经成为了一项重要的工具。它不仅仅是简单地展示数据,更是提供了深入理解数据、做出更明智决策的方法。作为一名可视化设计从业人员,我经手过一些企业自用的数据可视化项目,今天就来和大家聊聊数据可…

C语言第十七集(待修)

11.30的视频 1.结构体可以这样重新赋值 注:字符数组不能用来赋值 2.匿名结构体重新赋值方法: 注:在创建x时就已经使用过一次匿名结构体了 但是,在使用匿名结构体时,可以一次性创立多个变量 3.结构体内存对齐和对其规则详细搜: 4.总之,我们在创建结构体时,要将占用空间小的成…

一个newman命令行让某大厂瘫痪半天,速看!

newman简介 newman是为Postman而生,专门用来运行Postman编写好的脚本; 使用newman,你可以很方便的用命令行来执行postman collections。 newman的安装 1.先下载Node.js;https://nodejs.org/en/ 2.安装NodeJs(很容易安装&#x…

cmd命令 常用的命令

网络工作为常年公司里的背锅侠,不得不集齐十八般武艺很难甩锅。像cmd命令这种好用又好上手的技术,就是网络工程师上班常备技能。 只要按下快捷键 winR,输入cmd回车,然后输入cmd命令。 像我自己,我就经常用cmd命令检测…

初识优先级队列与堆

1.优先级队列 由前文队列queue可知,队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列,在此情况下,使用队列queue显然不…

xilinx的XVC协议

文章目录 概述JTAG工作方式XVC协议 其他Debug Bridge IP 概述 JTAG工作方式 XVC协议 其他 Debug Bridge IP

cookie总结

cookie和session: 一、Cookie和Session二、使用Cookie保存用户上次的访问时间。三、Cookie常用方法总结乱码问题解决: 一、Cookie和Session 会话:用户从打开浏览器到关闭的整个过程就叫1次会话。 比如有的网站登录过一次,下次再进…

python的websocket方法教程

WebSocket是一种网络通信协议,它在单个TCP连接上提供全双工的通信信道。在本篇文章中,我们将探讨如何在Python中使用WebSocket实现实时通信。 websockets是Python中最常用的网络库之一,也是websocket协议的Python实现。它不仅作为基础组件在…

Spring AOP 概念及其使用

目录 AOP概述 什么是AOP? 什么是Spring AOP ? Spring AOP 快速入门 1.引⼊ AOP 依赖 2.编写AOP程序 Spring AOP 核心概念 1.切点 2.连接点 3.通知 4.切面 通知类型 注意事项: PointCut(定义切点) 切面优先级 Order 切点表达…

IDEA删除最近打开的文件记录

IDEA删除最近打开的文件记录 遇见问题:如何删除IDEA中最近打开的文件记录 解决方法 先关闭IDEA 找到 recentProjects.xml 文件 windows 位置:(AppData是隐藏文件夹) 1.C:\Users\电脑用户名\AppData\Roaming\JetBrains\IntelliJIde…

Bash脚本调用百度翻译API进行中文到英文的翻译

写一个bash脚本调用百度翻译API进行中文到英文的翻译,首先需要进行相关的申请。看百度给出的文档链接: 百度翻译API文档 需要先注册一个百度账号,然后申请APPID。脚本中会用到appid和key这两个值。按照文档给出的提示可以获得。如下是脚本: #…

零基础如何入门HarmonyOS开发?

HarmonyOS鸿蒙应用开发是当前非常热门的一个领域,许多人都想入门学习这个技术。但是,对于零基础的人来说,如何入门确实是一个问题。下面,我将从以下几个方面来介绍如何零基础入门HarmonyOS鸿蒙应用开发学习。 一、了解HarmonyOS鸿…

markdown记录

文章目录 基础操作使用一级列表、二级列表 博文链接 基础操作 使用一级列表、二级列表 博文链接 CSDN-Markdown语法集锦 CSDN-markdown语法之如何使用LaTeX语法编写数学公式 CSDN Markdown简明教程1-关于Markdown CSDN Markdown简明教程2-基本使用 CSDN Markdown简明教程3-表…

X86汇编语言:从实模式到保护模式(代码+注释)--c6

X86汇编语言:从实模式到保护模式(代码注释)–c6 标志寄存器FLAGS: 6th:ZF位(Zero Flag):零标志,执行算数或者逻辑运算之后,会将该位置位。10th:D…

油猴(Tampermonkey)浏览器插件简单自定义脚本开发

介绍 浏览器插件,包括油猴插件和其他插件,通过它们可以实现浏览器网页的定制化与功能增强。 其他插件一般只有某种具体的功能,且已经写死而不能更改,比如Adblock插件只用于去广告。 油猴插件是一款用于管理用户脚本的插件&…

RocketMQ - SpringBoot整合RocketMQ

SpringBoot整合RocketMQ 1、快速实战 ​ 按照SpringBoot三板斧&#xff0c;快速创建RocketMQ的客户端。创建Maven工程&#xff0c;引入关键依赖&#xff1a; <dependencies><dependency><groupId>org.apache.rocketmq</groupId><artifactId>r…

HarmonyOS应用开发工具DevEco Studio安装与使用

语雀知识库地址&#xff1a;语雀HarmonyOS知识库 飞书知识库地址&#xff1a;飞书HarmonyOS知识库 知识库内容逐步完善中… 工欲善其事必先利其器&#xff0c;要编写HarmonyOS应用就需要用到官方提供的IDE工具来编写相应的代码。 在鸿蒙开发者官网&#xff0c;其提供了官方的开…

Markdown从入门到精通

Markdown从入门到精通 文章目录 Markdown从入门到精通前言一、Markdown是什么二、Markdown优点三、Markdown的基本语法3.1 标题3.2 字体3.3 换行3.4 引用3.5 链接3.6 图片3.7 列表3.8 分割线3.9 删除线3.10 下划线3.11 代码块3.12 表格3.13 脚注3.14 特殊符号 四、Markdown的高…

Ubuntu 22.04源码安装yasm 1.3.0

sudo lsb_release -r看到操作系统的版本是22.04&#xff0c;sudo uname -r可以看到内核版本是5.15.0-86-generic&#xff0c;sudo gcc --version可以看到版本是11.2.0&#xff0c;sudo make --version可以看到版本是GNU Make 4.3。 下载yasm http://yasm.tortall.net/Downlo…

深入了解Java 8日期时间新玩法:DateTimeFormatter与ZoneOffset的使用

推荐语 在这篇文章中&#xff0c;我们将深入探讨Java中的DateTimeFormatter和ZoneOffset类的功能和使用方法。这些类是在Java 8中引入的新的日期时间API的一部分&#xff0c;它们为我们提供了更灵活、更易用的日期和时间处理能力。尽管这些类在Java 8中已经出现&#xff0c;但…