当前位置: 首页 > news >正文

Go线程调度器

基本结构

在这里插入图片描述

字段gcwaiting、stopwait和stopnoted都是串行运行时任务执行前后的辅助协调手段

gcwaiting字段的值用于表示是否需要停止调度

  • 在停止调度前,该值会被设置为1
  • 在恢复调度之前,该值会被设置为0
  • 这样做的作用是,一些调度任务在执行时只要发现gcwaiting的值为1,就会把当前P的状态置为Pgcstop,然后自减stopwait字段的值
  • 如果发现自减后的值为0,就说明所有P的状态都已为Pgcstop
  • 这样就可以利用stopnote字段,唤醒因等待调度停止而暂停的串行时任务了

字段sysmonwait和sysmonnote与前面那一组字段的用户类似,只不过它们针对的是系统监测任务

  • 在串行运行时任务执行之前,系统监测任务也需要暂停
  • sysmonwait字段的作用就是表示是否已暂停,0表示未暂停,1表示已暂停

系统监测任务是持续执行的,更准确地说,它处在无尽的循环之中。在每次迭代之初,系统监测程序都会先检查调度情况

一旦发现调度停止(gcwaiting字段的值不为0或所有的P都已闲置),就会把sysmonwait字段的值设置为1,并利用sysmonnote字段暂停自身。另一方面,在恢复调度之前,调度器发现sysmonwait字段的值不为0,就会把它置为0,并利用sysmonnote字段恢复系统监测任务的执行

一轮调度

在这里插入图片描述

封装main函数的G总是Go运行时创建的第一个用户G。用户G因Go程序中的代码而生,用于封装用户级的程序片段(即需并发执行的函数)。相对的,用户封装运行时任务的G称为运行时G

M锁定的情况

在一轮调度开始处,调度器会先判断当前M是否已被锁定。M和G是可以成对地锁定在一起

锁定M和G的操作可以说是为CGO准备的。CGO代表了Go中的一种机制,是Go程序和C程序之间的一座桥梁。是它们的相互调用成为可能

通过调用runtime.LockOSThread函数,把当前的G与当时运行它的那个M锁定在一起,也可以通过调用runtime.UnlockOSThread函数解除当前G与某个M的锁定

如果调度器在一轮调度之初发现当前M已与某个G锁定,就会立即停止调度并停止当前M(或是说让它暂时阻塞)。一旦与它锁定的G处于可运行状态,它就会被唤醒并继续运行那个G

停止当前M意味着相关的内核线程不能再去做其他事情了。此时,调度器也不会为当前M寻找可运行的G。相应的,当调度器为当前M找到了一个可运行的G,但却发现该G已与某个M锁定,它就会唤醒那个与锁定的M以运行该G,并重新为当前M寻找可运行的G

M未锁定的情况& 串行任务

如果调度器判断当前M未与任何G锁定,那么一轮调度的主流程就会继续进行

调度器会检查是否有运行时串行任务正在等待执行

  • 串行任务,这类任务执行时需要停止Go调度器。官方称此种停止操作为"Stop the world",简称STW

如果gcwaiting字段的值不为0,那么一轮调度流程又会走进另一个分支,即:停止并阻塞当前M以等待运行时串行任务执行完成。一旦串行任务执行完成,该M就会被唤醒,一轮调度也会再此开始

寻找可运行G

如果调度器在此关于锁定和运行时串行任务的判断都为假,就会开始真正的可以运行G寻找之旅。一旦找到一个可运行G,调度器就会判断该G未与任何M锁定之后,立即让当前M运行它

全力查找可运行的G

调度器如果没有找到可运行的G,就会进入“全力查找可运行G”的子流程。这个子流程会多次尝试从各处搜索可运行的G,甚至还会从别的P(非本地P)哪里偷取可运行的G

获取执行终结器的G

一个终结器可以与一个对象关联,通过调用runtime.SetFinalizer函数就可以产生这种关联

当一个对象变为不可达(即:未被任何其他对象引用)时,垃圾回收器在回收该对象之前,就会执行与之关联的终结函数

所有终结函数的执行都会由一个专用的G负责。调度器会在判定这个专用G已完成任务之后试图获取它,然后把它置为Grunnable状态并放入本地P的可运行G队列

从本地P的可运行G队列获取G

调度器会尝试从该处获取一个G,并把它作为结果返回

从调度器的可运行G队列获取G

调度器会尝试从该处获取一个G,并把它作为结果返回

从网络I/O轮询器(或称netpoller)处获取G

如果netpoller已被初始化且已有过网络I/O操作,那么调度器会试着从netpoller哪里获取一个G列表,并把作为表头的那个G当作结果返回,同时把其余的G都放入调度器的可运行G队列

如果netpoller还未被初始化或还未有过网络I/O操作,这一步就会跳过

从其他P的运行G队列获取G

在条件允许的情况下,调度器会使用一种伪随机算法在全局P列表中选取P

然后试着从它们的可运行G队列中盗取(转移)一半的G到本地P的可运行G队列。选取P和盗取G的过程会重复多次,成功即停止

如果成功,那么调度器就会盗取的一个G作为结果返回。否则,搜索的第一阶段就结束了

获取执行GC标记任务的G

在搜索的第二阶段,调度器会先判断是否正处于GC标记阶段,以及本地P是否可用于GC标记任务

如果答案都是true,调度器就会把本地P持有的GC标记专用G置为Grunnable状态并作为结果返回

从调度器的可运行G队列获取G

调度器再次尝试从该处获取一个G,并把它作为结果返回

如果依然找不到可运行的G,就会解除本地P与当前M的关联,并把该P放入调度器的空闲P列表

从全局P列表中每个P的可运行G队获取G

遍历全局P列表中的P,并检查它们的可运行G队列

只要发现某个P的可运行G队列不为空的,就从调度器的空闲P列表中取出一个P,并在判定其可用后与当前M关联在一起,然后再返回第一阶段重新搜索可运行的G

如果所有P的可运行G队列都是空的,那就只能继续后面的搜索

获取执行GC标记任务的G

判断是否正处于GC的标记阶段,以及与GC标记任务相关的全局资源是否可用

如果答案都是true,调度器就会从其空闲P列表拿出一个P。如果这个P持有一个GC标记专用G,就关联该P与当前M,然后再次执行第二阶段

从网络I/O轮询器(netpoller)处获取G

如果netpoller已被初始化了,并且有过网络I/O操作,那么调度器会再次试着从netpoller哪里获取一个G列表

此步骤和之前步骤基本相同,但有一个明显区别:这里的获取是阻塞的

只有当netpoller哪里有可用的G时,阻塞才会解除

相关文章:

Go线程调度器

基本结构 字段gcwaiting、stopwait和stopnoted都是串行运行时任务执行前后的辅助协调手段 gcwaiting字段的值用于表示是否需要停止调度 在停止调度前,该值会被设置为1在恢复调度之前,该值会被设置为0这样做的作用是,一些调度任务在执行时只…...

使用 fvm 管理 Flutter 版本

文章目录 Github官网fvm 安装Mac/Linux 环境Windows 环境 fvm 环境变量fvm 基本命令 Github https://github.com/leoafarias/fvmhttps://github.com/flutter/flutter 官网 https://fvm.app/ fvm 安装 Mac/Linux 环境 Install.sh curl -fsSL https://fvm.app/install.sh …...

若依-前后端分离项目学习

★★★★★省流 直接看第一集和最后一集★★★★★ 第一天(6.24) 具体参考视频 b站 楠哥教你学Java 【【开源项目学习】若依前后端分离版,通俗易懂,快速上手】 https://www.bilibili.com/video/BV1HT4y1d7oA/?shar…...

使用adb shell getprop命令获取Android设备的属性

常用属性获取: adb shell getprop ro.build.version.emui —查询EMUI版本 adb shell getprop ro.product.brand —查询手机品牌 adb shell getprop ro.product.name --查询设备名称 adb shell getprop ro.serialno —查询设备序列号 获取手机系统信息( CPU,厂商…...

LNMP环境部署指南

本文档将指导您在CentOS 6.5上部署LNMP(Linux、Nginx、MySQL、PHP)环境。 系统环境 系统平台:CentOS release 6.5 安装前准备 在安装LNMP之前,您需要安装一些编译器和依赖包。 必备编译器和工具 #安装gcc、gcc-c编译器&#…...

[stm32]温湿度采集与OLED显示

一、I2C总线协议 I2C(Inter-integrated circuit )是一种允许从不同的芯片或电路与不同的主芯片通信的协议。它仅用于短距离通信,是一种用于两个或多个设备之间进行数据传输的串行总线技术,它可以让你在微处理器、传感器、存储器、…...

大模型知识库的使用

大模型知识库的使用通常涉及以下几个方面,使用大模型知识库可以提高信息检索的准确性和效率,促进知识的传播和应用。同时,也需要关注知识库的质量和更新,以确保提供的知识是准确和可靠的。北京木奇移动技术有限公司,专…...

Docker - Oracle Database 23ai Free

博文目录 文章目录 说明命令NavicatSYSTEMPDBADMIN 扩展公共用户本地用户 说明 Oracle 官方镜像仓库 Database 23ai Free | Oracle Docker 官方没有提供 Oracle Database 相关镜像, 但是 Oracle 官方镜像仓库有提供, 打开上面的链接, 选择 Database, 选择合适的版本, 如 enter…...

spring常用方法

1. 读取配置文件信息 方式一: // 获取文件路径 String fileName "application.yaml"; String filePath this.getClass().getClassLoader().getResource(fileName).getPath();BufferedReader bufferedReader new BufferedReader(new FileReader(path)…...

虚拟机能装在移动硬盘里吗安全吗 PD虚拟机迁移到移动硬盘的方法

虚拟机技术的迅速发展为用户提供了更为灵活的跨系统办公方案。许多用户希望在不同的电脑设备上运行相同的虚拟机,同时带来的也有一个问题:虚拟机能否装在移动硬盘里?针对用户的疑问,接下来给大家介绍虚拟机能装在移动硬盘里吗&…...

刷算法Leetcode---7(二叉树篇)(前中后序遍历)

前言 本文是跟着代码随想录的栈与队列顺序进行刷题并编写的 代码随想录 好久没刷算法了,最近又开始继续刷,果然还是要坚持。 二叉树的题目比之前多了好多,就多分几次写啦~ 这是力扣刷算法的其他文章链接:刷算法Leetcode文章汇总 …...

AliyunOS安装Node.js

方法1:dnf软件包安装工具自动安装 最方便的安装方式是通过系统的dnf工具,我测试使用的AliyunOS的版本是Alibaba Cloud Linux 3.2104,具体流程如下: dnf module list nodejs #列出服务器中可以使用的所有nodejs版本确定下来希望安…...

three.js - MeshPhongMaterial材质(实现玻璃水晶球效果)

1、概念 phong网格材质:Mesh - Phong - Material 一种用于具有镜面高光的光泽表面的材质。 它可以模拟,具有镜面高光的光泽表面,提供镜面反射效果。 MeshPhongMaterial: MeshPhongMaterial是一种基于Phong光照模型的材质&#…...

笔记本电脑安装CentOS

正文共:1234 字 24 图,预估阅读时间:2 分钟 前面我们对VPP进行了多次介绍(羡慕!大佬的VPP能达到180G性能,而我的却只有13.5G),可以发现他的很多优点,但是我们也可以发现它…...

ssh转发功能入门

端口转发概述 端口转发,能够将其他TCP端口的网络数据通过SSH链路转发,并且提供了ssh的加密和解密的服务。 ssh端口转发有如下这些优点: 提供了ssh的加密传输,利于安全能够突破防火墙限制 目前ssh端口转发有如下几种方式&#x…...

Listary(Windows 文件搜索工具)专业版值得购买吗?

说到经典的国货软件,有一款 Win 软件是一定绕不过去的。它就是知名的本地文件搜索工具 Listary! 便捷的文件搜索窗口;快捷操作的体验;与系统更匹配的外观设计;更智能的排序和更可靠的索引。 便捷的文件搜索窗口 紧凑…...

面试突击指南:Java基础面试题2

面向对象和集合 1. 面向对象和面向过程的区别 面向过程:面向过程的编程方式是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,并在使用的时候逐个调用。这种方式性能较高,因此在单片机和嵌入式开发中经常采用面向过程开发。 面向对象:面向对象的编程方式是把问…...

MySQL快速安装(mysql8.0.30区别之前yum安装)

目录 一.初始化环境并解压 二.创建程序用户管理 三.修改mysql目录和配置文件的权限 四.修改配置文件 五.设置环境变量,申明/宣告mysql命令便于系统识别 六.初始化数据库 七.设置系统识别,进行操作 八.初始化数据库密码 九.用户并设置密码 十.赋…...

俄罗斯防空系统

俄罗斯的S系列防空系统是一系列先进的地对空导弹系统,旨在防御各类空中威胁,包括飞机、无人机、巡航导弹和弹道导弹。以下是几种主要的S系列防空系统: 1. **S-300系统**: - **S-300P**:最早期的版本,用…...

文件上传漏洞---Pyload

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 本文重点从靶场案例分析文件上传漏洞常见的Pylod,本文演示靶场upload-labs 一.文件类型---Pyload 不同的文件对应不同的文件类型,后端代码通过限制特定的文件类型…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

Android15默认授权浮窗权限

我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率&#xff0c…...

LangFlow技术架构分析

🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

Windows 下端口占用排查与释放全攻略

Windows 下端口占用排查与释放全攻略​ 在开发和运维过程中&#xff0c;经常会遇到端口被占用的问题&#xff08;如 8080、3306 等常用端口&#xff09;。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口&#xff0c;帮助你高效解决此类问题。​ 一、准…...

FOPLP vs CoWoS

以下是 FOPLP&#xff08;Fan-out panel-level packaging 扇出型面板级封装&#xff09;与 CoWoS&#xff08;Chip on Wafer on Substrate&#xff09;两种先进封装技术的详细对比分析&#xff0c;涵盖技术原理、性能、成本、应用场景及市场趋势等维度&#xff1a; 一、技术原…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)

一、题目解析 对于递归方法的前序遍历十分简单&#xff0c;但对于一位合格的程序猿而言&#xff0c;需要掌握将递归转化为非递归的能力&#xff0c;毕竟递归调用的时候会调用大量的栈帧&#xff0c;存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧&#xff0c;而非…...

Linux入门课的思维导图

耗时两周&#xff0c;终于把慕课网上的Linux的基础入门课实操、总结完了&#xff01; 第一次以Blog的形式做学习记录&#xff0c;过程很有意思&#xff0c;但也很耗时。 课程时长5h&#xff0c;涉及到很多专有名词&#xff0c;要去逐个查找&#xff0c;以前接触过的概念因为时…...