Go线程实现模型-P

P

概述

P是G能够在M中运行关键。Go的运行时系统会适时地让P与不同的M建立或断开关联,以使P中的那些可运行的G能够及时获得,这与操作系统内核在CPU之上实时切换不同进程或线程的情况类似

改变P的数量

改变单个Go程序间拥有的P的最大数量有两种方法

  • 调用函数runtime.GoMAXRPOCS并把想要设定的数量作为参数传入
  • 在Go程序运行前设置环境变量GOMAXPROCS的值(硬性上限值256)

P的最大数量实际上是对程序中并发运行的G的规模的现实。P的数量即为可运行G的队列的数量。

一个G在被启用后,会先被追加到某个P的可运行G队列中,以等待时机。一个P只有与一个M关联在一起,才会使其可运行G队列中的G有机会运行

不过,设置P的最大数量只能限制住P的数量,而对G和M的数量没有任何约束。

使用了runtime.GoMAXRPOCS后,会暂时使P都脱离运行状态,并试图阻止任何用户级别的G的运行。只有在新P最大值设定完成后,运行时系统才会开始陆续恢复它们

M阻塞时,P的状况

当M因系统调用而阻塞(运行的G进入了系统调用)的时候,运行时系统会把该M和与之关联的P分离出来

这时,如果这个P的可运行G队列中还没有未被运行的G,那么运行时系统就会找到一个空闲M,或创建一个新的M,并与该P关联以满足这些G的运行需要

因此,M的数量在很多时候也都会比P多。而G的数量,一般取决于Go程序本身

重整P

在确定P最大数量之后,运行时系统会根据这个数值重整全局的P列表(runtime.allp)。与全局M列表类似,该列表中包含了当前运行时系统创建的所有P

运行时系统会把这些P中的可运行G全部取出,并放入调度器的可运行G队列中。被转移的那些G,会在以后经由调度再次放入某个P的可运行G队列

空闲P列表

与空闲M列表类似,运行时系统中也存在一个调度器的空闲P列表(runtime.sched.pidle)。当一个P不再与任何M关联的时候,运行时系统会把放入该列表

而当运行时系统需要一个空闲的P关联某个M的话,会从此列表中取出一个。注意,P进入空闲P列表的一个前提是它的可运行G列表必须为空

例如,在重整全局P列表的时候,P在被清空可运行G队列之后,才会被放入空闲P列表

P的状态转换

P的状态

Pidle: 此状态表明当前P未与任何M存在关联

Prunning: 此状态表明当前P正在与某个M关联

Psyscall: 此状态表明当前P中的运行的那个G正在进行系统调用

Pgcstop: 此状态表明运行时系统需要停止调度。例如运行时系统在开始垃圾回收的某些步骤前,就会试图把全局P列表中的所有P都置于这个状态

状态转换

在这里插入图片描述

P 创建之初的状态是Pgcstop,虽然这并不意味这时进行垃圾回收。不过,P处于这一初始状态的时间非常短暂

初始化之后,运行时系统会将其状态设置为pidle,并放入调度器的空闲P列表

图中可见,非Pdead状态的P都会在运行时系统欲停止调度时被置于Pgcstop状态,然后统一转换为Pidle状态,并公平地接受再次调度

另一方面,非Pgcstop状态的P都可能因全局P列表的缩小而被认为是多余的,并被置于Pdead状态。同时P被转换为Pdead前,其可运行G队列的G都会转移到调度器的可运行G队列,而它的自由G列表中的G也都会被转移到调度器的自由G列表中

自由G列表

每个P中除了都有一个可运行G队列外,还都包含一个自由G列表,这个列表中包含了一些已经运行完成的G

随着运行完成的G的增多,该列表可能会很长。如果它增长到一定程度,运行时系统就会把其中的部分G转移到调度器的自由G列表中

另一方面,当使用go语句欲启用一个G的时候,运行时系统会试图从相应P的自由G列表中获取一个现成的G,来封装这个go语句携带的函数,仅当获取不到一个G的时候才有可能创建一个新的G

考虑到由于相应P的自由G列表为空获取不到自由G的情况,运行时系统会在发现其中的自由G太少时,预先尝试从调度器的自由G列表中转移过来一些G。如此一来,只有在调度器的自由G列表也弹尽粮绝的时,才会有新的G被创建。这在很大程度上提高了G的复用率

总结

在P的结构中,可运行G队列和自由G列表最重要的两个成员。至少对于Go语言的是这样,它们间接地体现了运行时系统对G的调度情况

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

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

相关文章

安卓手机的自带录屏在哪里找?5个软件帮助你快速给手机录屏

安卓手机的自带录屏在哪里找?5个软件帮助你快速给手机录屏 在安卓手机上进行屏幕录制是一项非常实用的功能,特别是对于需要录制游戏操作、制作教程或演示的用户来说。虽然部分安卓手机可能已经预装了屏幕录制功能,但有时候这些功能可能隐藏在…

技术派Spring事件监听机制及原理

Spring事件监听机制是Spring框架中的一种重要技术,允许组件之间进行松耦合通信。通过使用事件监听机制,应用程序的各个组件可以在其他组件不直接引用的情况下,相互发送和接受消息。 需求 在技术派中有这样一个需求,当发布文章或…

每日Attention学习7——Frequency-Perception Module

模块出处 [link] [code] [ACM MM 23] Frequency Perception Network for Camouflaged Object Detection 模块名称 Frequency-Perception Module (FPM) 模块作用 获取频域信息,更好识别伪装对象 模块结构 模块代码 import torch import torch.nn as nn import to…

Ubuntu(通用)—网络加固—ufw+防DNS污染+ARP绑定

1. ufw sudo ufw default deny incoming sudo ufw deny in from any to any # sudo ufw allow from any to any port 5353 protocol udp sudo ufw enable # 启动开机自启 # sudo ufw reload 更改后的操作2. 防ARP欺骗 华为云教程 arp -d删除dns记录arp -a显示arp表 ipconfi…

IMU在手语识别中的应用

近期,一款由美国和中国科研团队联合研发的新型的穿戴设备——SignRing,以其独特的IMU(惯性测量单元)技术,为聋哑人士的手语识别带来了革命性的突破。SignRing不仅极大地扩展了手语识别的词汇量,更提高了识别…

C++多态~~的两个特殊情况

目录 1.多态的概念 2.简单认识 (1)一个案例 (2)多态的两个满足条件 (3)虚函数的重写 (4)两个特殊情况 1.多态的概念 (1)多态就是多种形态; …

windows USB设备驱动开发-双角色驱动

在USB的通讯协议中,规定发起连接的一方为主机(Host),接受连接的一方为设备,这可以用U盘插入电脑举个例子,当U盘插入电脑后,电脑这边主动发起查询和枚举,U盘被动响应查询和数据存取。 USB 双角色驱动程序堆…

为Ubuntu-24.04-live-server-amd64磁盘扩容

系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 文章目录 系列文章目录前言一、检查系统本身情况1.用 lsblk 命令查看自己系统磁盘是什么状态2.用 df -h 命令查看文件系统的磁盘空间使用情况3.解决 Ubuntu-24.04 磁盘空间只能用一半的问题3-1扩展逻辑卷&#xff…

二叉树层序遍历

题目描述 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 假设有这样一棵二叉树,那么它经过层序遍历的结果就应该是: [[3],[9,20],[15,7]]解法 我们可以用广度…

css美化滚动条样式

效果展示 实现 滚动条宽,高度 /* 整体滚动条 */ ::-webkit-scrollbar {width: 10px; }/* 滚动条轨道 */ ::-webkit-scrollbar-track {background-color: #ffffff;border-radius: 6px; }/* 滚动条滑块 */ ::-webkit-scrollbar-thumb {background-color: #888;borde…

IDEA安装使用、JDBC

day53续 IDEA安装 浏览器搜索,在idea官网直接下载需要的版本安装包,安装流程基本无脑 对于专业版要激活,可找相关资源也可购买;社区版不需要 配置环境变量 JDBC JDBC:java database connectivity SUN公司提供的一套操作数据库的…

计算机毕业设计Python深度学习美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js

Python美食推荐系统开题报告 一、项目背景与意义 随着互联网和移动技术的飞速发展,人们的生活方式发生了巨大变化,尤其是餐饮行业。在线美食平台如雨后春笋般涌现,为用户提供了丰富的美食选择。然而,如何在海量的餐饮信息中快速…

【Excel、RStudio计算T检测的具体操作步骤】

目录 一、基础知识1.1 显著性检验1.2 等方差T检验、异方差T检验1.3 单尾p、双尾p1.3.1 检验目的不同1.3.2 用法不同1.3.3 如何选择 二、Excel2.1 统计分析工具2.1.1 添加统计分析工具2.1.2 数据分析 2.2 公式 -> 插入函数 -> T.TEST 三、RStudio 一、基础知识 参考: 1.…

2.2章节python的变量和常量

在Python中,变量和常量有一些基本的概念和用法,但需要注意的是,Python本身并没有内置的“常量”类型。然而,程序员通常会遵循一种约定,即使用全部大写的变量名来表示常量。 一、变量 在Python中,变量是一…

新手教学系列——【Ubuntu】SSH配置详解

在使用Ubuntu进行远程管理和开发时,SSH(Secure Shell)是必不可少的工具。SSH不仅提供安全的远程登录功能,还支持安全的文件传输和端口转发。然而,有时我们可能会遇到SSH连接中断的问题。本文将详细介绍如何配置SSH以提高其稳定性,并解释关键配置项。 为什么会出现SSH连接…

基于X86+FPGA的精密加工检测设备解决方案

应用场景 随着我国高新技术的发展和国防现代化发展,航空、航天等领域需 要的大型光电子器件,微型电子机械、 光 电信息等领域需要的微型器件,还有一些复杂零件的加工需求日益增加,这些都需要借助精密甚至超精密的加工检测设备 客…

算法 —— 滑动窗口

目录 长度最小的子数组 无重复字符的最长子串 最大连续1的个数 将x减到0的最小操作数 找到字符串中所有字母异位词 长度最小的子数组 sum比target小就进窗口,sum比target大就出窗口,由于数组是正数,所以相加会使sum变大,相减…

实施粘贴式导航_滚动事件

● 所谓的粘贴式导航,就是当我们滑动页面到某一个位置的时候,导航不会因为滑动而消失,会固定在页面的顶部,我们来看一下如何实现; ● 首先我们要获取我们想要滚动到哪一部分的时候让导航栏显示出来,这就需要…

前端工程化09-webpack静态的模块化打包工具(未完结)

9.1、开发模式的进化历史 webpacks是一个非常非常的强大的一个工具,相应的这个东西的学习也是有一定的难度的,里边的东西非常的多,里面涉及到的 概念的话也是非常非常的多的。 这个东西既然非常重要,那么在我们前端到底处于怎样…

填志愿选专业,文科男生如何选专业?

又到了高考分数出炉,无数学子收获喜悦的季节,在分数刚出炉时,很多学生表现的异常兴奋,于他们而言,这么多年的努力终于有了收获,自己该考虑选择什么专业了。而毫不夸张的说,很多人在拿到专业目录…