【golang】调度系列之P

news2024/11/26 19:22:16

调度系列
调度系列之goroutine
调度系列之m

在前面两篇中,分别介绍了G和M,当然介绍的不够全面(在写后面的文章时我也在不断地完善前面的文章,后面可能也会有更加汇总的文章来统筹介绍GMP)。但是,抛开技术细节,我想经过前面两篇,应该已经对GMP建立了基本的认知。GMP本质就是个任务处理系统,G是任务,M是worker,runtime创建一定数量的worker来运行任务。

一个简单的任务处理系统,只任务和worker两个对象足够胜任。从这个角度来说,似乎GM就足够了,并不需要P。实际上,golang的调度系统最开始就是采用了GM模型。然而golang的调度系统显然不是简单的任务处理系统,而是一个复杂度非常高的任务系统,在迭代过程中遇到了很多的问题。为了解决这些问题,runtime在G和M之间引入了一个中间层,就是P。任何计算机科学领域的问题都可以通过引入一个中间层来解决,越来越觉得这句话是大道至简、大音希声。

关于runtime调度系统演进过程的细节可以参见google的文档google doc,这里就不过多介绍。

文章目录

  • 状态图
  • P的结构

状态图

在介绍具体的细节前,先介绍下P整体的状态的流转。P的状态相对G的状态要简单一些,相对M的状态则要复杂得多。P的状态和G一样,具有明确定义的可枚举的状态值。

  • idle。P处于空闲状态。此时的P没有被用来运行用户的goroutine或者时runtime的代码,也可以说P并没有被具体的m持有。大多数情况下,处于idle状态的P应该位于全局的idle list中。
    为什么这里说大多数呢?这和runtime的实现相关。在runtime的实现中,由其他状态(syscall、gcstop)转变为running时,会先转变为idle,再由idle转变为running。
  • running。P处于运行状态。此时P被m持有,被用来运行用户的goroutine或者runtime的代码。对应的m可能处于running、spinning状态。running状态应该是最好理解的状态,P大部分时间也应该处于running状态。
  • syscall。P处于系统调用状态。当P上运行的g进入系统调用时m会与P解绑,将P置为syscall状态。当系统调用结束时,m会首先尝试获取原来的P,再尝试获取idle list中的P,如果拿不到则挂起。
    P进入syscall时根据系统调用时间长短有两种选择,当系统调用时间较短时P处于syscall等待m;当系统调用时间比较长时,会调用handoffp将p转移给其他的m继续执行g。
    以上的操作都是在runtime中通过pre hook和post hook的方式实现的。
  • gcstop。P处于STW状态。P由running转变为gcstop时会和当前的m解绑,当strat the word时,会重新驱动m来获取P。
  • dead。P处于死亡状态。只有调用procresize方法缩减P的数量时才会触发,调用p.destroy方法,释放所有的资源。当procresize只有在stop the world时才会调用,所以dead只能由gcstop转变而来(不是很确定)。

状态流转图如下。

简单介绍P的状态流转。

  • runtime初始化时会调用procresize创建GOMAXPROCS个P,初始化时P的状态会在p.init中被设为gcstop,但最终会被设为idle,并加入全局的idle list中。
  • 当有goroutine创建(newproc)或者goroutine就绪(goready)时,会调用wakep。如果存在idle的p并且没有自旋的m,wakep启动m将idle的P转变为running。
  • running状态的P可以转变为gcstop、idle、syscall。
    • 当m在运行findrunnable时发现runtime需要gc(gcwaiting!=0),会将P转变为gcstop状态并和P进行解绑;
    • 当m在findrunnable中找不到可运行的任务时,会将P转变为idle状态并挂起;
    • 当m(g)调用系统调用时,会将P转变为syscall状态;
    • 另外在一些情况下,m也会调用handoffp主动转移P的持有,比如runtime判断一个系统调用的时间比较长是,会将P转变为syscall,然后主动handoffp转移P的持有;

P的结构

P的字段很多,这里同样就挑几个重要的说明。可见下图。

  • 资源相关。
    引入P的一个最大的好处就是减少了资源的浪费。在GM相关的模型中,运行goroutine相关的资源是分配给每个M的,比如内存。但是在生产系统中,真正运行的m的数量占总数的比例很小,大多数可能在阻塞中。这样就导致了资源的浪费。引入P后,相关的资源都分配给P,m在执行时首先要获取P。这样就大大减少了资源的浪费。所以P中有很多资源相关的字段,比如mcache、pcache、mspan等。
    另外,比如向timer类似的数据结构,也从全局对象变为每个P持有的对象。这样做可以大大减少并发冲突。因为同一个P上同时最多只有一个goroutine执行,并发只存在跨P的操作中。
  • 调度相关。
    之前在goroutine和M的介绍中提到了很多调度相关的内容。但其中的内容都是属于主动调度。runtime中真正的异步抢占或者说异步调度是依靠sysmon来实现的。sysmon是一个独立的m,并且其运行不需要持有P。sysmon会定期的扫描每个P,如果goroutine占据P的时间超过10ms,怎会触发异步抢占。其中schedtick、syscalltick、sysmontick等字段都是和sysmon相关。关于sysmon,我们会在后面再详细介绍。

至此,对G、M、P都有了单独的介绍和认识,对runtime的调度系统,应该有了初步和大概的认识。注意,runtime中还有一个全局的schedt对象,但是该对象仅保存一些全局的数据,而不负责具体的调度,所以不单独介绍。后面我们会结合前面G、M、P的介绍,对调度整体进行介绍,并陆续地针对细节进行补充。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为云云耀云服务器L实例使用教学 | 访问控制-安全组配置规则 实例教学

文章目录 访问控制-安全组什么叫安全组安全组配置默认安全组配置安全组配置实例安全组创建安全组模板配置安全组模板:通用Web服务器 配置安全组规则安全组配置规则功能介绍修改允许特定IP地址访问Web 80端口服务建立仅允许访问特定目的地址的安全规则配置网络ACL对实…

开源数字孪生基础设施

开源数字孪生基础设施 开源数字基础设施 开源数字基础设施 开源软件是基础设施发展的一种模式,这是在2007年美国科学基金会发布的《认识基础设施:动力机制、冲突和设计》中得出的结论。在这份55页的报告中三次集中谈到了开源软件(Open Sourc…

1999-2018年地级市经济增长数据

1999-2018年地级市经济增长数据 1、时间:1999-2018年 2、指标: 行政区划代码、城市、年份、地区生产总值_当年价格_全市_万元、地区生产总值_当年价格_市辖区_万元、人均地区生产总值_全市_元、人均地区生产总值_市辖区_元、地区生产总值增长率_全市_…

MySQL使用C语言链接

MySQL使用C语言链接 MySQL connect接口介绍mysql_initmysql_real_connectmysql_querymysql_store_result\mysql_use_result()mysql_num_rowsmysql_num_fieldsmysql_fetch_fieldsmysql_fetch_rowmysql_close MySQL connect 使用C语言来连接数据库,本质上就是利用一些…

「聊设计模式」之命令模式(Command)

🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅! 前言 在面向对象设计中,设计模式是重要的一环。设计…

c:Bubble Sort

/*****************************************************************//*** \file SortAlgorithm.h* \brief 业务操作方法* VSCODE c11* \author geovindu,Geovin Du* \date 2023-09-19 ***********************************************************************/ #if…

前端知识以及组件学习总结

JS 常用方法 js中字符串常用方法总结_15种常见js字符串用法_<a href"#">leo</a>的博客-CSDN博客 <script>var str"heool"console.log(str.length);console.log(str.concat(" lyt"));console.log(str.includes("he&quo…

WebPack5基础使用总结(一)

WebPack5基础使用总结 1、WebPack1.1、开始使用1.2、基本配置 2、处理样式资源2.1、处理Css资源2.2、处理Less资源2.3、处理Sass和Scss资源2.4、处理Styl资源 3、处理图片资源3.1、输出资源情况3.2、对图片资源进行优化 4、修改输出资源的名称和路径4.1、自动清空上次打包资源 …

想了解期权分仓交易和开户?这里告诉你。

期想了解期权分仓交易和开户&#xff1f;这里告诉你。权就是合约交易&#xff0c;通过买卖认购和认沽期权合约实现未来是否能赚钱&#xff0c;具备做多和做空T0双向交易机制&#xff0c;期权分仓开户就是零门槛开通期权账户&#xff0c;下文介绍想了解期权分仓交易和开户&#…

经验分享|作为程序员之后了解到的算法知识

欢迎关注博主 六月暴雪飞梨花 或加入【六月暴雪飞梨花】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术…

Java————栈

一 、栈 Stack继承了Vector&#xff0c;Vector和ArrayList类似&#xff0c;都是动态的顺序表&#xff0c;不同的是Vector是线程安全的。 是一种特殊的线性表&#xff0c; 其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另…

《计算机视觉中的多视图几何》笔记(4)

4 Estimation – 2D Projective Transformations 本章主要估计这么几种2D投影矩阵&#xff1a; 2D齐次矩阵&#xff0c;就是从一个图像中的点到另外一个图像中的点的转换&#xff0c;由于点的表示都是齐次的&#xff0c;所以叫齐次矩阵3D到2D的摄像机矩阵基本矩阵三视图之间的…

基于conda的相关命令

conda 查看python版本环境 打开Anaconda Prompt的命令输入框 查看自己的python版本 conda env list激活相应的python版本(环境&#xff09; conda avtivate python_3.9 若输入以下命令可查看python版本 python -V #注意V是大写安装相应的包 pip install 包名5.查看已安装…

智能井盖:提升城市井盖安全管理效率

窨井盖作为城市基础设施的重要组成部分&#xff0c;其安全管理与城市的有序运行和群众的生产生活安全息息相关&#xff0c;体现城市管理和社会治理水平。当前&#xff0c;一些城市已经将智能化的窨井盖升级改造作为新城建的重要内容&#xff0c;推动窨井盖等“城市部件”配套建…

工控机通过Profinet转Modbus RTU网关连接变频器与电机通讯案例

在工业自动化系统中&#xff0c;工控机扮演着重要的角色&#xff0c;它是数据采集、处理和控制的中心。工控机通过Profinet转Modbus RTU网关连接变频器与电机通讯&#xff0c;为工业自动化系统中的设备之间的通信提供了解决方案。工控机通过Profinet转Modbus RTU网关的方式&…

(leetcode)单值二叉树

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 画图与分析&#xff1a; 题目&#xff1a; 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&…

2023年以就业为目的学习Java还有必要吗?(文末送书)

目录 一、活力四射的 Java二、从零开始学会 Java三、准备工作四、基础知识五、进阶知识六、高级知识七、结语参与方式 大家好&#xff0c;我是哪吒。 文末送5本《Java编程动手学》 今天来探讨一个问题&#xff0c;现在学 Java 找工作还有优势吗&#xff1f; 在某乎上可以看到…

MS1861 视频处理与显示控制器 HDMI转MIPI LVDS转MIPI带旋转功能 图像带缩放,旋转,锐化

1. 基本介绍 MS1861 单颗芯片集成了 HDMI 、 LVDS 和数字视频信号输入&#xff1b;输出端可以驱动 MIPI(DSI-2) 、 LVDS 、 Mini-LVDS 以及 TTL 类型 TFT-LCD 液晶显示。可支持对输入视频信号进行滤波&#xff0c;图 像增强&#xff0c;锐化&#xff0c;对比度调节&am…

ai虚拟主播看车线上虚拟三维展示节约成本和资源

线上车展汽车3D展厅突破了前期虚拟和现实的障碍&#xff0c;使用户无论身在哪个城市&#xff0c;都可以随时随地在线3D看车&#xff0c;极大的方便了消费者的看车的线上体验。因此对企业来说&#xff0c;有购车意愿的顾客必然是会提高成交的可能性&#xff0c;那么如何满足顾客…

固定资产管理系统的特点有哪些

固定资产管理系统是一种用于管理企业固定资产的软件。其功能如下&#xff1a;  自动化管理&#xff1a;固定资产管理系统可自动管理企业固定资产&#xff0c;包括采购、仓储、申请、维护、损坏等流程&#xff0c;大大提高了工作效率。  实时监控&#xff1a;固定资产管理系…