千家信息网

Go语言调度的本质是什么

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,本篇内容介绍了"Go语言调度的本质是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先抛出本文的
千家信息网最后更新 2025年01月23日Go语言调度的本质是什么

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

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

生产者-消费者

生产者-消费者模型

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

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

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

生产-消费过程

生产过程——三级队列

生产出的 goroutine 需要找一个地方存放,这个地方就是可运行队列。在 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 程序在启动的时候,会创建和 CPU 核心数相等个数的 P,会创建初始的 m,称为 m0。这个 m0 会启动一个调度循环:不断地找 g,执行,再找 g……

伪代码是这样的:

调度循环

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

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

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

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

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

生产 调度 队列 运行 过程 消费 循环 实际 更多 生产者 本质 不断 任务 实际上 就是 情况 程序 线程 语言 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 联合国数据库使用说明 文件发送失败被对方服务器退回 马鞍山服务器机箱生产厂家 黑客网络技术团队 找不到dns服务器地址 山东魔点互联网科技有限公司 信息化和网络安全的关系 玩的游戏的服务器忘记了怎么办 宿迁云主机服务器厂商 计算机应用与网络技术学哪个好 普法微动漫网络安全教程 网站服务器租用和托管 计算机网络技术哪个快入门 普陀区机电软件开发产品介绍 java 数据库安装 桃江县委网络安全 找网络安全的工作需要学习什么 服务器cpu用至强还是amd 天灾惊变服务器能炸吗 进寺庙网络安全宣传 云海麒麟服务器管理口ip 竞技世界(成都)网络技术 怎么修改服务器空间文件 南京市天妙互联网科技有限公司 盐城365网络技术 携程旅游数据库 网络中控主机是属于服务器吗 数据库中创建登录用户的待遇 黄埔网络安全运维怎么收费 网络安全内容20个字
0