最开始的时候,我们讲了 GPM 到底是什么,当时没有看过太多源码,所以对 GPM 没有一个整体上的认识。

现在我们终于到了快要结束的时候,可以从宏观上总结一下 GPM,这篇文章尝试从它们的状态流转角度总结。

首先是 G 的状态流转:

图上除了 park_m 和 ready 这一块外其他都有涉及。这一对函数在前面讲 channel 的时候有提到,后面我们有机会再单独说一下这部分。

上图省略了一些垃圾回收的状态,毕竟这个系列没有讲这一块。完整的状态流转图可以到参考资料【欧神 调度器初始化】里看。

接着是 P 的状态流转:

通常情况下(在程序运行时不调整 P 的个数),P 只会在上图中的四种状态下进行切换。当程序刚开始运行进行初始化时,所有的 P 都处于 _Pgcstop 状态, 随着 P 的初始化( runtime.procresize),会被置于 _Pidle

当 M 需要运行时,会 runtime.acquirep 来使 P 变成 Prunning 状态,并通过 runtime.releasep 来释放。

当 G 执行时需要进入系统调用,P 会被设置为 _Psyscall, 如果这个时候被系统监控抢夺( runtime.retake),则 P 会被重新修改为 _Pidle

如果在程序运行中发生 GC,则 P 会被设置为 _Pgcstop, 并在 runtime.startTheWorld 时重新调整为 _Prunning

上面这段引用自【欧神 调度器初始化】。

最后,我们来看 M 的状态变化:

M 只有自旋和非自旋两种状态。自旋的时候,会努力找工作;找不到的时候会进入非自旋状态,之后会休眠,直到有工作需要处理时,被其他工作线程唤醒,又进入自旋状态。

这是调度器系列的最后一篇文章了。整个系列的核心在于:

  1. GPM 的初始化;

  2. M 是怎样一步步找工作;

  3. 用户栈和 g0 栈的切换;

  4. schedule 的调度循环是怎样运转的;

  5. 监控线程做了什么。

其他和 GC 相关的,我们暂时并未涉及到,留到后续再探索。

调度器的探索我们就要告一段落了,感谢陪伴。

参考资料

【欧神 调度器初始化】https://github.com/changkun/go-under-the-hood/blob/master/book/zh-cn/part2runtime/ch06sched/init.md
【Go 夜读 boya】https://reading.developerlearning.cn/reading/12-2018-08-02-goroutine-gpm/

意犹未尽 —— GPM 的状态流转(十)相关推荐

  1. Scrum中文网-疫情之下2021敏捷年度状态报告十大看点

    原文链接:疫情之下2021敏捷年度状态报告十大看点 - Scrum中文网 2021年全球疫情仍在进行时,变化和未知是时代的主旋律,今年刚好又是"敏捷软件开发宣言"诞生20周年,那么 ...

  2. 【Java进阶营】Java技术专题「难点-核心-遗漏」Java线程状态流转及生命周期的技术指南(知识点串烧)

    前提介绍 本章主要介绍相关线程声明周期的转换机制以及声明周期的流转关系以及相关AQS的实现和相关的基本原理,配合这相关官方文档的中英文互译的介绍. 线程状态流转及生命周期 当线程被创建并启动以后,它既 ...

  3. 【深入浅出Java并发编程指南】「难点 - 核心 - 遗漏」线程状态流转及生命周期的技术指南(知识点串烧)

    前提介绍 本章主要介绍相关线程声明周期的转换机制以及声明周期的流转关系以及相关AQS的实现和相关的基本原理,配合这相关官方文档的中英文互译的介绍. 线程状态流转及生命周期 当线程被创建并启动以后,它既 ...

  4. 【电商】订单信息与状态流转

    前言订单产生后,接下来会继续进行一系列流转,最后送到用户手里.在每个环节都有对应的操作,数据信息也要求其完成性,可以根据订单的每个状态变化,来计算分析,进而进行优化供应链路径,以提升订单处理效率,提高 ...

  5. 文本显示变量_几千个IO状态显示.十几分钟搞定实例

    工程上常会在一个或者数个界面中对所有IO点监控,很多小伙伴用一一映射的传统方法来实现,在超小型项目中实用性较强,在稍微大一点的项目中实现起来效率低还经常出错.本文旨在分享有价值的实际经验,供小伙伴们参 ...

  6. Java 线程状态流转

    Java 线程一共有 6 种状态: NEW:新建状态,当一个线程被创建完成,还没有调用 start() 方法时,是这种状态. RUNNABLE:可运行状态,当一个线程正在正常地执行 run() 中的代 ...

  7. Java线程状态流转及部分函数说明

    下面这张是Java线程状态改变的图例. 下面就其中几点和函数进行说明 运行态 Java将操作系统中的"运行中running"和"就绪ready"两种状态统称为运 ...

  8. Thread状态流转、方法使用、原理分析

    沉淀.分享.成长,让自己和他人都能有所收获!

  9. 深入理解 Go 调度模型 GPM

    Author mogd 2022-04-28 Update mogd 2022-05-05 Adage Be content with what you have; rejoice in the wa ...

最新文章

  1. Pandownload惊喜复活!下载速度惊人!
  2. MyEclipse6.0注册码算法代码,MyEclipse7.0注册码算法代码
  3. 机器学习中的算法(1)-决策树模型组合之随机森林与GBDT
  4. mysql 用户管理和权限设置
  5. python 中locals() 和 globals()
  6. Swagger注解-@ApiImplicitParams 和 @ApiImplicitParam
  7. FreeRTOS-绪论
  8. Vmware在ubuntu虚拟机上安装Vmtools
  9. 实习成长之路——设计模式三:组合与继承有啥关系?为什么说多用组合少用继承?如何选择使用哪种方式?
  10. MESSL(maven + extjs + spring portlet mvc + spring web flow + liferay )整合架构 7
  11. spring学习笔记二(基于注解)
  12. python 三角形雷达图,python 画雷达图
  13. 快速了解电力IEC104协议规约
  14. 聚合支付平台需要哪方面的技术?主要有哪些功能结构?
  15. 9大时序异常检测方法汇总
  16. JAVA动态网页开发:框架
  17. 索辰科技在科创板过会:拟募资金额有所下调,上半年亏损4000万元
  18. Misc,院赛:两道签到、忘记密码
  19. java多线程- 互斥锁 自旋锁
  20. 新的优化目标: energy efficiency

热门文章

  1. mysql主从配置原理_MySQL主从复制原理
  2. 网络套接字(Network socket)
  3. socket和http协议
  4. window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法
  5. mysql 导入导出.sql文件
  6. 实用算法实现-第6篇 线段树
  7. HDU - 5008 Boring String Problem(后缀树求本质不同第k大子串)
  8. 牛客 - Final Exam(贪心)
  9. POJ - 3974 Palindrome(二分+哈希/马拉车)
  10. UVA - 1606 Amphiphilic Carbon Molecules