Go线程实现模型-G

G

概述

一个G就代表一个goroutine(或称Go例程),也与go函数相对应。作为编程人员,我们只是使用go语句向Go的运行时系统提交一个并发任务,而Go的运行时系统则会按照我们要求并发地执行它

Go编译器会把go语句变成对内部函数newproc的调用,并把go函数及其参数都作为参数传递给这个函数

G的前置

运行时系统在接到这样一个调用之后,会先检查go函数及其参数的合法行,然后试图从本地P的自由G列表和调度器的自由G列表获取可用的G,如果没有获取到,就新建一个G

与M和P相同,运行时系统也持有一个G的全局列表(runtime.allgs)。新建的G会在第一时间被溅入该列表

类似地,这个全局列表的主要作用:

  • 集中存放当前运行时系统中的所有G的指针
  • 无论用于封装当前这个go函数的G是否是新的,运行时系统都会对它进行一次初始化,包括关联go函数以及设置该G的状态和ID等步骤

在初始化完成后,这个G会立即被存储到本地P的runnext字段中。该字段用于存放新鲜出炉的G,以求更早地运行它。如果这时runnext字段已存有一个G,那么这个已有的G就会被“踢到”该P的可运行G队列的末尾

如果该队列已满,那么这个G就只能追加到调度器的可运行G队列中

G的状态转换

G的状态

Gidle: 表示当前G刚被分配时,但还未初始化

Grunnable: 表示当前G正在可运行队列中等待运行

Grunning: 表示当前G正在运行

Gsyscall: 表示当前G正在执行某个系统调用

Gwaiting: 表示当前G正在阻塞

Gcopystack: 表示当前G的栈正被移动,移动的原因可能是栈的扩展或收缩

Gscan: 这个状态并不能独立存在,而是组合状态的一部分。

  • 比如,Gscan与Grunnable组合成Cscanrunnable状态,代表当前G正等待运行,同时它的栈正被扫描,扫描的原因一般是GC任务执行
  • 又比如,Gscan与Grunning组合成Gscanrunning状态,表示正处于Grunning状态的当前G的栈要被GC扫描的一个短暂时刻

状态转换

在这里插入图片描述

一个G在运行的过程中,是否会等待某个事件以及会等待什么样的事件,完全由封装的go函数决定

  • 例如,如果这个函数中包含对通道值的操作,那么在执行到对应代码的时候,这个G就有可能进入Gwaiting状态。这可能是在等待从通道类型值中接收值,也可能是在等待向通道类型值发送值
  • 又例如,涉及网络I/O的时候也会导致相应的G进入Gwaiting状态。

此外,操纵定时器(time.Timer)和调用time.Sleep函数同样会造成相应G的等待。在事件到来之后,G会被"唤醒"并转移至Grunnable状态。待时机到来时,它会被再次运行

G 在退出系统调用(Gsyscall)时状态转换要比上述情况复杂一些。运行时系统会先尝试直接运行这个G,仅当无法直接运行的时候,才会把它转换为Grunnable状态并放入调度器的自由G列表中

进入死亡状态(Gdead)的G是可以重新初始化并使用的。相比之下,P在进入死亡状态(Pdead)之后,就只能面临销毁的结局。处于Gdead的G会被放入本地P或调度器的自由G列表

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

张嘴就能生图?一分钟教会你使用魔法!(Stable Diffusion进阶:SDXL-Turbo)

大家好我是极客菌!!!Stable Diffusion,一款基于深度学习的图像生成模型,以其强大的图像生成能力和个性化风格迁移能力,在艺术创作领域掀起了一场革命。而SDXL-Turbo,作为Stable Diffusion的进阶…

ADS基础教程23 - 有限元电磁仿真(FEM)可视化操作

EM介绍 一、引言二、FEM可视化操作流程1.打开可视化界面2.查看介质的网格3.设置网格颜色4.选择网格5.传感器选择6.编辑传感器7.选择频率8.动画 三、总结 一、引言 在ADS基础教程22中介绍了如何在ADS进行有限元电磁仿真(FEM),本文将继续介绍F…

MD5算法详解

哈希函数 是一种将任意输入长度转变为固定输出长度的函数。 一些常见哈希函数有:MD5、SHA1、SHA256。 MD5算法 MD5算法是一种消息摘要算法,用于消息认证。 数据存储方式:小段存储。 数据填充 首先对我们明文数据进行处理,使其…

Jasper studio报表工具中,如何判断subDataSource()子报表数据源是否为空

目录 1.1、错误描述 1.2、解决方案 1.1、错误描述 今天在处理一个有关Jasper Studio报表模板制作的线上问题,需要根据某个报表子数据源是否为空,来决定对应的组件是否显示,找了好久的资料都没有实现,最后找到一种解决办法。就是…

专为运维工程师设计!阿里藏经阁出品的Python实战手册被我搞来了

Python 可能是极少数既简单又强大的编程语言中的一种。更重要的是,用它来编程是非常快乐的事。 今天给小伙伴们分享的是阿里“藏经阁”出品的专门给运维工程师设计的Python实战手册 废话不多说,下面把内容展示给大家 01 Python快速回顾 02 Python脚本…

Linux下SUID提权学习 - 从原理到使用

目录 1. 文件权限介绍1.1 suid权限1.2 sgid权限1.3 sticky权限 2. SUID权限3. 设置SUID权限4. SUID提权原理5. SUID提权步骤6. 常用指令的提权方法6.1 nmap6.2 find6.3 vim6.4 bash6.5 less6.6 more6.7 其他命令的提权方法 1. 文件权限介绍 linux的文件有普通权限和特殊权限&a…

【剑指Offer系列】68-二叉树的最近公共祖先(哈希)

思路:使用map存储每个节点的父节点,则两个节点的最近公共祖先,即二者的最近父节点 1、中序遍历二叉树(当前节点的下一个节点) 2、记录每个节点的父节点 3、列出p的族谱、q的族谱 4、寻找二者最近的祖先 class Soluti…

CesiumJS【Basic】- #041 绘制纹理线(Entity方式)- 需要自定义着色器

文章目录 绘制纹理线(Entity方式)- 需要自定义着色器1 目标2 代码2.1 main.ts3 资源文件绘制纹理线(Entity方式)- 需要自定义着色器 1 目标 使用Entity方式绘制纹理线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer

美团外卖异地点餐怎么更改定位位置信息?

美团外卖异地点餐怎么更改定位位置信息? 1、打开「词令」关键词口令直达工具,输入词令「外卖红包88」,搜索直达该词令关联的目标,获得外卖红包天天领入口; 2、成功领取后,打开美团外卖APP,切换…

互联网场景下人脸服务基线方案总结

1.简介 1.1目的 在过去的一段时间里,因为听见业务对人脸服务方案的需求,针对网络视频中关键人物定位的检索任务,完成了基于互联网场景的人脸基线服务的构建。本文档是对当前基线服务以后之后解决方案的优化进行总结。 1.2范围 本文档描述的人…

华为防火墙在广电出口安全方案中的应用(方案设计、配置、总结)

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 你们好,我的网工朋友。 不知道你有没有想过,我们每天看电视、上网追剧的广电网络,它的背后是如何确保安全稳定…

Git 命令学习之推送本地项目到 Gitee 托管

引言 在软件开发中,版本控制是不可或缺的一环。Git 作为目前最流行的分布式版本控制系统,广泛应用于各种项目中。而 Gitee(原名码云)作为国内知名的代码托管平台,为开发者提供了稳定、安全的代码托管服务。下面将详细…

Eclipse配置Tomcat时无Apache选项问题

有可能你会遇到,安装最新版本Eclipse,但是 Window——Preferences——Servers——Runtime Environments。发现没有Apache选项。,这是因为,默认没有安装J2EE组件,我们可以通过手动安装,来解决这个问题。 一…

vue3中的图片懒加载指令及全局注册

vue3中的图片懒加载指令及全局注册 最近重新刷了一遍黑马的小兔鲜前端项目,发现有个懒加载的指令之前还没有用过。而且写法相对固定,因此记录一下 首先,懒加载(Lazy Loading)的作用是延迟加载某些资源或组件&#xf…

【秋招突围】2024届秋招笔试-科大讯飞笔试题-03-三语言题解(Java/Cpp/Python)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📧 清隆这边…

日期时间显示网页

SweetOrange_Clock 🕘 一、简介 1、这个项目包括一个HTML文件,其中包含页面的样式和脚本。 2、页面以优雅的黑白配色为主题,突出了实用性和视觉冲击力,使得显示内容在视觉上更为突出和易于阅读。 3、这是一个日期时间显示器。通…

数据库定义语言(DDL)

数据库定义语言(DDL) 一、数据库操作 1、 查询所有的数据库 SHOW DATABASES;效果截图: 2、使用指定的数据库 use 2403 2403javaee;效果截图: 3、创建数据库 CREATE DATABASE 2404javaee;效果截图: 4、删除数据…

Supabase 自托管部署实践

Supabase 是 Firebase 的开源替代品。使用 Postgres 数据库、身份验证、即时 API、边缘函数、实时订阅、存储和向量嵌入来启动您的项目。 Supabase介绍 Supabase 是一个开源的后端即服务(BaaS)平台,提供了一系列工具和服务,帮助…

刷代码随想录有感(122):动态规划——最长子序列

题干&#xff1a; 代码&#xff1a; class Solution { public:int lengthOfLIS(vector<int>& nums) {if(nums.size() < 1)return nums.size();vector<int>dp(nums.size(), 1);int res 0;for(int i 1; i < nums.size(); i){for(int j 0; j < i; j)…

Windows 10,11 Server 2022 Install Docker-Desktop

docker 前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 docker-compose Compose 是用于定义和运行…