Golang goroutine MPG模式浅析

2023-09-14 19:32:26

协程是通过使用关键字 go 调用(或执行)一个函数或者方法来实现的(也可以是匿名函数)。

 Go 语言在语言层面上支持了并发,goroutine是Go语言提供的一种用户态线程,有时我们也称之为协程。

所谓的协程,某种程度上也可以叫做轻量线程,它不由os而由应用程序创建和管理,因此使用开销较低(一般为4K)。

我们可以创建很多的goroutine,并且它们跑在同一个内核线程之上的时候,就需要一个调度器来维护这些goroutine,确保所有的goroutine都能使用cpu,并且是尽可能公平地使用cpu资源。

调度器的主要有4个重要部分,分别是M、G、P、Sched,前三个定义在runtime.h中,Sched定义在proc.c中。

  • M (work thread) 代表了系统线程OS Thread,由操作系统管理。

  • P (processor) 衔接M和G的调度上下文它负责将等待执行的G与M对接。P的数量可以通过GOMAXPROCS()来设置,它其实也就代表了真正的并发度,即有多少个goroutine可以同时运行。

  • G (goroutine) goroutine的实体,包括了调用栈,重要的调度信息,例如channel等。

在操作系统的OS Thread和编程语言的User Thread之间,实际上存在3种线程对应模型,也就是:1:1,1:N,M:N。

  • N:1      多个(N)用户线程始终在一个内核线程上跑,context上下文切换很快,但是无法真正的利用多核。
  • 1:1      一个用户线程就只在一个内核线程上跑,这时可以利用多核,但是上下文切换很慢,切换效率很低。
  • M:N      多个goroutine在多个内核线程上跑,这个可以集齐上面两者的优势,但是无疑增加了调度的难度。

M:N 综合两种方式(N:1,1:1)的优势。多个 goroutines 可以在多个 OS threads 上处理。既能快速切换上下文,也能利用多核的优势,而Go正是选择这种实现方式。

 

 

MPG是其调度模型


M可以理解为主线程,它是一个物理级别的线程。它比较耗费资源。

p可以理解为在整个执行过程当中的上下文环境。上下文环境可以简单理解为运行时候所需要的资源或者当时操作系统的一个状态。

在主线程运行的过程当中,启动了一个协程,在协程起来的时候需要有一个上下文的环境。上下文环境,就是是否cpu可分配。需要的资源和当时运行的状态。

G是协程

多个m作用在一个cpu,那么就是并发。作用在多个cpu就是并行。可以看到M可以开启多个协程,形成一个队列。

Go 语言中的goroutine是运行在多核CPU中的(通过runtime.GOMAXPROCS(1)设定CPU核数)。 实际中运行的CPU核数未必会和实际物理CPU数相吻合。

每个goroutine都会被一个特定的P(某个CPU)选定维护,而M(物理计算资源)每次挑选一个有效P,然后执行P中的goroutine。

每个P会将自己所维护的goroutine放到一个G队列中,其中就包括了goroutine堆栈信息,是否可执行信息等等。

这里创建的M1线程可能就在其他cpu上了,有点像并行。

协程可以运行在操作系统多个线程之间,也可以运行在线程之内,让你可以很小的内存占用就可以处理大量的任务。由于操作系统线程上的协程时间片,你可以使用少量的操作系统线程就能拥有任意多个提供服务的协程,而且 Go 运行时可以聪明的意识到哪些协程被阻塞了,暂时搁置它们并处理其他协程。

 

 

总结:


M代表主线程向下执行,p上下文可以根据系统情况开启协程去工作。M可能有很多,可能全部在一个CPU上面,也可能每个M都在各个不同的CPU上面,这样就叫做并行。

当有协程被阻塞的时候,它有来回切换的一种机制。可以保证主线程的执行,也能够让排队的G协程得到执行的机会。

更多推荐

PostgreSQL 10.23 安装图文教程

目录一、PostgreSQL介绍二、下载安装包三、安装教程今天给大家分享Win10操作系统安装PostgreSQL10.23图文教程,希望对大家学习PostgreSQL能有所帮助!一、PostgreSQL介绍PostgreSQL(简称Postgres)是一款功能强大的开源关系型数据库管理系统,由PostgreSQLGl

深入理解 PostgreSQL 中的 MVCC(多版本并发控制)机制

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

css知识学习系列(5)-每天10个知识点

目录1.**Flexbox和Grid布局都是为了解决布局问题,但它们有什么不同?**2.**CSS中的“overflow”属性与布局有什么关系?有哪些常见的使用场景?**3.**在CSS中,如何使用“position”属性和“z-index”属性实现元素的层级关系?**4.**CSS中的“@keyframes”有什么作

shell --- 基础篇

一、符号介绍$#脚本的参数个数$*以一个单字符串显示所有脚本传递的参数$$当前进程ID号$!后台运行的最后一个进程的ID号$@与$*相同,但是使用时加引号,并在引号中返回每个参数。$-显示Shell使用的当前选项,与set命令功能相同。$?显示最后命令的退出状态(或函数的返回值)。0表示没有错误三、基础语法echo--

SpringBoot 的版本、打包、Maven

一、SpringBoot结构、集成1.1、集成组件SpringCore:Spring的核心组件,提供IOC、AOP等基础功能,是Spring全家桶的基础。SpringBoot:一个基于SpringFramework的快速开发框架,可以快速创建独立的、生产级别的Spring应用程序。SpringCloud:一个用于构建分

MySQL与PostgreSQL对比

MySQLPostgreSQL数据类型支持支持JSON,但不如PostgreSQL支持更多的数据类型,如数组、hstore、JSON、JSONB、范围类型等扩展性有一些扩展性,但不如PostgreSQL支持自定义数据类型、函数、操作符,具有强大的扩展性SQL兼容性遵循SQL标准,但有一些自定义扩展更接近ANSISQL标

RT-Thread 访问I/O设备

访问I/O设备应用程序通过I/O设备管理接口来访问硬件设备,当设备驱动实现后,应用程序就可以访问该硬件。查找设备:应用程序根据设备名称获取设备句柄,进而操作设备。获得设备句柄后,应用程序可使用如下函数对设备进行初始化操作:rt_err_trt_device_init(rt_device_tdevice);当一个设备已经

ROS2 的行为树 — 第 1 部分:解锁高级机器人决策和控制

一、说明在复杂而迷人的机器人世界中,行为树(BT)已成为决策过程中不可或缺的一部分。它们提供了一种结构化、模块化和高效的方法来对机器人的行为进行编程。BT起源于视频游戏行业,用于控制非玩家角色,他们在机器人领域找到了归宿,他们擅长管理无数的任务和条件。用于机器人导航的Nav2和操作框架MoveIt等机器人软件使用行为树

【数据结构与算法】概论

(多选题,3分)设n为算法中的问题规模,通常用()渐进符号表示算法的执行时间与n之间的一种增长关系。A.ΟB.ΘC.ΩD.ΣE.Φ正确答案:ABC解析:Ο是渐进上界,Ω是渐进下界。Θ需同时满足大Ο和Ω,故称为确界(必须同时符合上界和下界)。Ο极其有用,因为它表示了最差性能。Θ,读音:西塔;既是上界也是下界(tight)

电力系统直流潮流分析【N-1】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Matlab代码及文档讲解💥1概述该程序接受一个感受矩阵B=[NxN]和注入功

springboot集成mybatis-plus

一、在springboot中配置mybatis-plus1、创建一个springboot项目,注意勾选mysql2、在pom.xml文件中添加mybatis-plus的依赖包<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.or

热文推荐