iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Go语言调度的本质是什么
  • 523
分享到

Go语言调度的本质是什么

2023-06-15 11:06:46 523人浏览 安东尼
摘要

本篇内容介绍了“Go语言调度的本质是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先抛出本文的结论:Go 调度的本质是一个生产-消费流

本篇内容介绍了“Go语言调度的本质是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

首先抛出本文的结论:Go 调度的本质是一个生产-消费流程。

Go语言调度的本质是什么

生产者-消费者

生产者-消费者模型

我们平时用 Go 最爽的一点莫过于用一句 go func(){}() 就启动了一个 goroutine 来并发地执行任务。这比用 C/C++  启动一个线程并发地去执行任务方便太多。这句代码实际上就生产出了一个 goroutine,并进入可运行队列,等待和 m 来找它从而可以得到运行。

熟悉 GMP 模型的朋友都知道,goroutine 最终在 m 上得以执行,因为操作系统感知不到 goroutine,它只能感知线程,并且线程可以看成是  m。

所以,m 拿到 goroutine 并运行它的过程就是一个消费过程。

Go语言调度的本质是什么

生产-消费过程

生产过程——三级队列

生产出的 goroutine 需要找一个地方存放,这个地方就是可运行队列。在 Go 程序中,可运行队列是分级的,分为三级:

Go语言调度的本质是什么

三级可运行队列

runnext 实际上只能指向一个 goroutine,所以它是一个特殊的队列。

那把 goroutine 放到哪个可运行队列呢?看情况。

首先,如果 runnext 为空,那么 goroutine 就会顺利地放入 runnext,接下来,它会以最高优先级得到运行,即优先被消费。

如果 runnext 不为空,那就先负责把 runnext 上的 old goroutine 踢走,再把 new goroutine  放上来。具体踢到哪里呢?又得分情况。

local queue 是一个大小为 256 的数组,实际上用 head 和 tail 指针把它当成一个环形数组在使用。如果 local queue  不满,则将 runnext 放入 local queue;否则,P 的本地队列上的 goroutine 太多了,说明当前 P  的任务太重了,需要减负,因此需要得到其他 P 协助。从而,将 runnext 以及当前 P 的一半 goroutine 一起打包丢到 global queue  里去。

当然,这部分课程里有非常生动的动画,这里贴一个截图大家感受一下:

Go语言调度的本质是什么

生产者动画

消费过程——调度循环

之前的文章里也讲到过调度循环是咋回事,它实际上就是 Go 程序在启动的时候,会创建和 CPU 核心数相等个数的 P,会创建初始的 m,称为 m0。这个  m0 会启动一个调度循环:不断地找 g,执行,再找 g……

伪代码是这样的:

Go语言调度的本质是什么

调度循环

随着程序的运行,m 更多地被创建出来,因此会有更多的调度循环在执行。

那边生产者在不断地生产 g,这边 m 的调度循环不断地在消费 g,整个过程就 run 起来了。

找 g 的过程中当然也是从上面的三级队列里找:

先看 runnext,再看 local queue,再看 global queue。当然,如果实在找不到,就去其他 p 去偷。

“Go语言调度的本质是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Go语言调度的本质是什么

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

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

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

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

下载Word文档
猜你喜欢
  • Go语言调度的本质是什么
    本篇内容介绍了“Go语言调度的本质是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先抛出本文的结论:Go 调度的本质是一个生产-消费流...
    99+
    2023-06-15
  • Go语言中goroutine的调度原理是什么
    Go语言中goroutine的调度原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、关于并发的基础知识在讲gorou...
    99+
    2024-04-02
  • 揭秘Go的静态语言本质
    go 是一门静态类型语言,其类型系统在编译时就确定,在编译过程中会检测类型错误。go 的类型系统包括类型别名、接口和结构体,并基于赋值兼容性协定,即变量只能赋值给与它具有相同或更通用类型...
    99+
    2024-04-08
    go语言 静态语言
  • Go语言中并发的本质解读
    Go语言中并发的本质解读 Go语言是一门由Google开发的开源编程语言,旨在提高开发人员的生产力。其中最为突出的特点之一就是其强大的并发编程能力。在Go语言中,使用goroutine...
    99+
    2024-04-02
  • 深度解析:Go语言中goroutine的本质和运行机制
    在Go语言中,goroutine是一种轻量级的线程,用于并发执行代码片段。与传统的线程相比,goroutine更加高效,具有更低的内存消耗和更快的启动速度。在本文中,我们将深度解析Go...
    99+
    2024-03-12
    本质 运行机制 go语言
  • delete语法的本质是什么
    今天小编给大家分享一下delete语法的本质是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。delete 的返回值del...
    99+
    2023-07-05
  • 分析Go语言的特点与编程语言的本质
    标题:深度分析Go语言的特点与编程语言的本质 编程语言是人类用于编写计算机程序的一种符号系统,不同的编程语言具有不同的特点和设计哲学。其中,Go语言作为一种新兴的编程语言,具有独特的特...
    99+
    2024-03-07
    go语言 特点分析 编程本质 垃圾回收器 lsp
  • Go语言中为什么要有GMP调度模型
    今天小编给大家分享一下Go语言中为什么要有GMP调度模型的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。GMP调度模型是Go的...
    99+
    2023-07-06
  • go语言支持xp的版本是什么
    这篇“go语言支持xp的版本是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言支持xp的版本是什么”文章吧。go语...
    99+
    2023-07-04
  • go语言调用函数方法是什么
    在go语言中,定义了函数之后,我们可以通过“函数名()”的方式调用函数,语法“返回值变量列表 = 函数名(参数列表)”。当“()”中包含多个参数时,参数变量以逗号分隔,尾部无须以分号结尾;“返回值变量列表”中,多个返回值使用逗号分隔。本教程...
    99+
    2023-05-14
    Golang go语言 Go
  • Go语言的起源是什么语言?
    Go语言的起源是来自Google开发的一种编程语言,它的设计初衷是为了解决一些在现有语言中存在的问题。Go语言是一种静态类型的编程语言,于2007年开始研发,2009年首次正式发布。G...
    99+
    2024-04-02
  • go语言的底层是什么语言
    go语言的底层是C语言,Go语言是由C和C++开发者创建的,因此它的底层实现也是用C语言编写的,Go语言底层使用了很多C语言的特性和实现方式,如内存管理、指针、函数调用等,这使得Go语言可以直接调用C语言的库函数,也方便了Go语言与其他编程...
    99+
    2023-07-10
  • Go语言的基础是什么语言?
    Go语言的基础是C语言和Pascal语言。Go语言是由Robert Griesemer、Rob Pike和Ken Thompson三位大牛联合开发的。他们在设计Go语言时,主要参考了C...
    99+
    2024-04-02
  • Go语言是什么
    Go语言(又称 Golang)是一种静态强类型、编译型的编程语言,可以轻松构建简单、可靠以及高效的软件。Go语言语法与C语言相近,但功能更加丰富。Go语言的作者有三个,他们分别是:罗伯特·格利茨默(Robert Griesemer)、罗伯·...
    99+
    2024-04-02
  • Go语言是什么语言写成的?
    Go语言是一种由Google开发的开源编程语言,也被称为Golang。它是一种静态类型、编译型的语言,旨在提供高效的性能和简洁的语法。Go语言的设计注重简单性、效率和可维护性,因此受到...
    99+
    2024-03-14
    语言 编程 go语言 网络编程
  • 什么是go语言
    Go语言(又称Golang)是由Google开发的一种静态类型、编译型的开源编程语言。Go语言的设计目标是简洁、高效、安全和并发,旨在提供一种易于编写和维护的系统级编程语言。它结合了静态类型语言的安全性和高效性,以及动态类型语言的灵活性和开...
    99+
    2023-10-26
    go语言
  • go语言的beego是什么
    beego是一个使用Go语言开发的应用Web框架,目的是为大家提供一个高效率的Web应用开发框架,该框架采用模块封装。beego可以用来快速开发API、Web、后端服务等各种应用,是一个RESTFul的框架,主要设计灵感来源于tornado...
    99+
    2023-05-14
    go语言 Golang
  • const的本质是什么
    这篇文章主要介绍了const的本质是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇const的本质是什么文章都会有所收获,下面我们一起来看看吧。   并非真正的常量  ...
    99+
    2024-04-02
  • go语言和c语言是什么
    这篇文章主要介绍了go语言和c语言是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言和c语言是什么文章都会有所收获,下面我们一起来看看吧。Go(又称Golang)是Google开发的一种静态强类型、编...
    99+
    2023-07-04
  • go协程调度的原理是什么
    Go协程的调度原理是基于M:N的模型,其中M代表操作系统的线程,N代表Go协程。Go运行时系统会创建一定数量的操作系统线程,每个线程...
    99+
    2023-10-23
    go
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作