iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Go语言中为什么要有GMP调度模型
  • 294
分享到

Go语言中为什么要有GMP调度模型

2023-07-06 04:07:53 294人浏览 八月长安
摘要

今天小编给大家分享一下Go语言中为什么要有GMP调度模型的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。GMP调度模型是Go的

今天小编给大家分享一下Go语言中为什么要有GMP调度模型的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

GMP调度模型是Go的精髓所在,它合理地解决了多线程并发调度协程的效率问题。

GMP是什么

首先得清楚,GMP各代指什么东西。

  • G: Goroutine的缩写,指协程,运行在线程上。

  • M: Machine的缩写,即thead,线程,循环的调度协程并执行。

  • P: Processor的缩写,指处理器,将协程储存到本地队列,并为线程提供未休眠的可用的协程,

线程M各自持有一个处理器P,当要获取协程时优先从P中获取,于是GMP模型图解如下:

Go语言中为什么要有GMP调度模型

大致流程是,线程M从P的队列中获取协程,如果获取不到,就会从全局队列中去竞争来获取。

处理器P

协程G和线程M结构在前几篇已经讲解了,这里解析一下处理器P。

作用

处理器P储存着一批协程,使得线程M可以无锁的从中获取协程,而无需与其他线程去竞争全局队列中的协程,从而提高调度协程效率。

源码解析

p结构体源码src\runtime\runtime2.go中,这里展示部分重要字段。

type p struct {   ...   m           muintptr   // back-link to associated m (nil if idle)   // Queue of runnable goroutines. Accessed without lock.   runqhead uint32   runQtail uint32   runq     [256]guintptr   runnext guintptr   ...}
  • m为处理器p所属的线程

  • runq是一个储存协程的队列

  • runqheadrunqtail表示队列的头尾指针

  • runnext指向下一个可运行的协程

Go语言中为什么要有GMP调度模型

线程M与处理器P是如何协作的?

src\runtime\proc.go中,有一个schedule方法,这是线程运行的第一个函数。这函数中,线程需要获取到可运行的协程,代码如下:

func schedule() {        ...    // 寻找一个可运行的协程    gp, inheritTime, tryWakeP := findRunnable()     ...}
func findRunnable() (gp *g, inheritTime, tryWakeP bool) {    // 从本地队列中获取协程    if gp, inheritTime := runqget(pp); gp != nil {       return gp, inheritTime, false    }    // 本地队列拿不到则从全局队列中获取协程    if sched.runqsize != 0 {       lock(&sched.lock)       gp := globrunqget(pp, 0)       unlock(&sched.lock)       if gp != nil {          return gp, false, false       }    }}

从本地队列中获取协程

func runqget(pp *p) (gp *g, inheritTime bool) {   next := pp.runnext // 队列中下一个可运行的协程   if next != 0 && pp.runnext.cas(next, 0) {      return next.ptr(), true   }   ...}

那如果本地队列和全局队列中都没有协程了怎么办呢,难道就让线程这么闲着?

这时候处理器P就会任务窃取,从其他线程的本地队列中窃取一些任务,美其名曰分担其他线程的压力,还提高了自己线程的利用率。

源码在src\runtime\proc.go\stealWork中,感兴趣可以看看。

新建的协程该分配到哪?

新建的协程该分配到本地还是全局队列呢,得分情况:

  • Go认为新协程的优先级高,于是先寻找本地队列放入,而且还插队。

  • 本队队列满了才放入全局队列。

实际流程为:

  1. 随机寻找P

  2. 将新协程放入P的runnext中,意味着下一个就运行该协程,插队了

  3. 若P的协程满了,则放入全局队列

源码在src\runtime\proc.go\newproc函数中。

// Create a new g running fn.// Put it on the queue of g's waiting to run.// The compiler turns a go statement into a call to this.func newproc(fn *funcval) {   gp := getg()   pc := getcallerpc()   systemstack(func() {      newg := newproc1(fn, gp, pc) // 创建新协程      pp := getg().m.p.ptr()      runqput(pp, newg, true) // 寻找本地队列放入      if mainStarted {         wakep()      }   })}

以上就是“Go语言中为什么要有GMP调度模型”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Go语言中为什么要有GMP调度模型

本文链接: https://www.lsjlt.com/news/357677.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go语言中为什么要有GMP调度模型
    今天小编给大家分享一下Go语言中为什么要有GMP调度模型的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。GMP调度模型是Go的...
    99+
    2023-07-06
  • 深入浅析Go语言中要有GMP调度模型的原因
    Go为什么要有GMP调度模型?下面本篇文章给大家介绍一下Go语言中要有GMP调度模型的原因,希望对大家有所帮助!GMP调度模型是Go的精髓所在,它合理地解决了多线程并发调度协程的效率问题。GMP是什么首先得清楚,GMP各代指什么东西。G: ...
    99+
    2023-05-14
    后端 Go
  • Go语言中goroutine的调度原理是什么
    Go语言中goroutine的调度原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、关于并发的基础知识在讲gorou...
    99+
    2024-04-02
  • Go语言调度的本质是什么
    本篇内容介绍了“Go语言调度的本质是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先抛出本文的结论:Go 调度的本质是一个生产-消费流...
    99+
    2023-06-15
  • 为什么Go语言中的Windows数据类型如此重要?
    在Windows系统中,数据类型是非常重要的。这是因为Windows系统使用了许多特定的数据类型来处理各种不同的数据。在Go语言中,同样也有许多特定的数据类型可以用来处理Windows系统中的数据。本文将介绍为什么在Go语言中使用Wind...
    99+
    2023-09-12
    windows 数据类型 关键字
  • 有人称Go语言为什么?
    有人称Go语言为什么? 近年来,Go语言作为一种新兴的编程语言备受关注,越来越多的软件开发者选择使用Go语言来开发应用程序。那么,为什么有人称Go语言为“未来之语言”?本文将探讨Go语...
    99+
    2024-04-02
  • go语言中泛型是什么
    在go语言中,泛型就是编写模板适应所有类型,只有在具体使用时才定义具体变量类型;通过引入类型形参和类型实参的概念,让一个函数能够处理多种不同类型数据的能力,这种编程方式被称为泛型编程。本教程操作环境:windows7系统、GO 1.18版本...
    99+
    2023-05-14
    泛型 Go Golang go语言
  • Go语言error类型有什么作用
    本篇内容主要讲解“Go语言error类型有什么作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言error类型有什么作用”吧!在Go语言,error是一个接口类型。error接口类型是作...
    99+
    2023-07-05
  • 为什么要使用Rust语言、Rust语言有什么优势
    Rust 是一种采用过去的知识解决将来的问题的技术。” ——Graydon Hoare Rust 是一种快速、高并发、安全且具有授权性的编程语言,...
    99+
    2024-04-02
  • PHP程序员为什么要学习GO语言
    PHP程序员为什么要学习GO语言,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和...
    99+
    2024-04-02
  • 为什么要在NumPy框架中使用Go语言对象?
    NumPy是一个广泛使用的Python科学计算库,它提供了一种方便的方式来处理大量的数学和科学计算任务。然而,对于一些特殊的应用场景,Python的解释性语言特性和GIL的限制可能会成为性能瓶颈。这时,使用Go语言对象可以帮助我们充分利用...
    99+
    2023-08-21
    对象 numpy 框架
  • Go语言中类型与接口有什么关系
    在Go语言中,类型和接口之间有一对多和多对一的关系。一个类型可以同时实现多个接口,而接口间彼此独立,不知道对方的实现。多个类型也可以实现相同的接口:一个接口的方法,不一定需要由一个类型完全实现,接口的方法可以通过在类型中嵌入其他类型或者结构...
    99+
    2023-05-14
    go语言 Golang 接口
  • 为什么要将JS语言转成Go语言?多方面探讨
    如今,javascript(JS)作为一种通用的编程语言在前端开发中扮演着极其重要的角色,但是在服务端开发中,Golang(Go)也同样广受欢迎。那么,为什么要考虑将JS语言转换成Go语言呢?本文将从以下几个方面探讨这个问题。1.性能方面J...
    99+
    2023-05-14
  • go语言必须要有的包是什么
    本篇内容介绍了“go语言必须要有的包是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!go语言必须有一个main包。Go语言是编译型的静态...
    99+
    2023-07-04
  • go语言的数据类型有什么用
    这篇文章主要讲解了“go语言的数据类型有什么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go语言的数据类型有什么用”吧!go语言是谷歌2009发布的开源编程语言。Go语言最初由Googl...
    99+
    2023-07-04
  • go语言中泛型是的是什么
    今天小编给大家分享的是go语言中泛型是的是什么,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。在go语言中,泛型就是编写模板适应所有类型,只有在具体使用时才定义具体变量类型;通过引入类...
    99+
    2023-07-04
  • 为什么Go语言有时也需要考虑对齐的问题
    本篇文章给大家分享的是有关为什么Go语言有时也需要考虑对齐的问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。CPU 访问内存时,并不是逐个字...
    99+
    2024-04-02
  • 为什么Go语言的数据类型对于开发者来说很重要?
    在现代编程语言中,数据类型是一种关键的概念。数据类型决定了编程语言能够处理的数据种类和数据结构。在Go语言中,数据类型也是一个非常重要的概念。在本文中,我们将探讨为什么Go语言的数据类型对于开发者来说非常重要。 Go语言是一种静态类型的编...
    99+
    2023-07-03
    数据类型 npm 框架
  • 为什么要使用Go语言进行并发编程?
    随着计算机技术的不断进步,人们对并发编程的需求也越来越高。并发编程是指同时执行多个任务的能力,其优点是可以提高程序的性能和响应速度。在传统的编程语言中,如C++和Java,实现并发编程需要使用线程和锁等复杂的机制。而Go语言则提供了一种更...
    99+
    2023-07-27
    同步 并发 日志
  • GO语言中的数据类型和JavaScript有什么不同?
    随着计算机技术的不断发展,越来越多的编程语言出现在我们的视野中。其中,GO语言和JavaScript都是非常受欢迎的编程语言之一。虽然二者都是面向对象的语言,但是在数据类型方面,GO语言和JavaScript还是存在一些不同的地方。 一、...
    99+
    2023-11-12
    数据类型 存储 javascript
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作