【Go】Go语言并发模型:MPG

embedded/2025/4/1 14:06:44/

Go 语言并发模型:MPG

Go 的并发模型主要由三个部分构成:

  • M (Machine)
    系统线程,用于实际执行任务。

  • P (Processor)
    逻辑处理器,负责管理和调度 goroutine。每个 P 拥有一个本地队列和关联的全局 G 队列。

  • G (Goroutine)
    Go 语言中的协程,是程序执行的基本单元。


M 与 P 的关系

  • 1:1 关系
    每个运行的任务对应的 M 必须关联一个 P,即 M 和 P 是一对一的关系。

  • 本地队列与全局队列

    • 每个 P 拥有自己的本地 G 队列,当本地队列满时,多余的 G 会被放入全局队列中。

系统调用和调度机制

Syscall 与阻塞处理

  1. 线程阻塞

    • 当某个 M(例如 M0)在执行 syscall 时陷入阻塞,它会释放所绑定的 P。
    • 该 P 会转交给一个空闲的 M(例如 M1)继续执行。
    • 如果没有空闲的 M,则会创建新的 M 来接管 P。
  2. 系统调用结束后的处理

    • 如果 M0 在系统调用结束后能获取到空闲的 P,则继续执行原来的 G(例如 G0)。
    • 如果没有空闲的 P,则 G0 会被放入全局队列,等待其它 P 调度,而 M0 则进入缓存池等待唤醒。
  • 全局队列 (runqueue)
    该队列用于调度各个 P 在运行完本地队列后的 G。

Work Stealing 机制

  • 调度策略
    • 当当前线程的本地队列中没有可运行的 G 时,会首先尝试从全局队列中获取任务。
    • 如果全局队列中也没有可用的 G,该线程将从其它线程绑定的 P 中“偷取”一半的 G 以保证负载均衡。

Sysmon 协程

  • 作用

    • sysmon 协程专门用于监控和管理协程状态,不需要 P 的支持即可执行。
  • 抢占策略

    • 在 Go 中,所有 goroutine 最多占用 CPU 时间为 10ms,超过这个时间的协程会被抢占,以防止某个 goroutine 独占 CPU,确保其他 goroutine 得到运行机会。

补充机制

  • 协程抢占

    • 通过协程抢占机制,Go 能够在长时间运行的协程中及时切换,确保系统中各个任务的公平调度。
  • 垃圾回收

    • Go 的垃圾回收机制会定期回收不再使用的内存,优化内存资源的利用。

http://www.ppmy.cn/embedded/176924.html

相关文章

Java基础 3.22

1.break练习 //1-100之内的数求和&#xff0c;求当和第一次大于20的当前数i public class Break01 {public static void main(String[] args) {int n 0;int count 0;for (int i 1; i < 100; i) {count i;System.out.println("当前和为" count);if (count &g…

Flink 通过 Chunjun Oracle LogMiner 实时读取 Oracle 变更日志并写入 Doris 的方案

文章目录 一、 技术背景二、 关键技术1、 Oracle LogMiner2、 Chunjun 的 LogMiner 关键流程3、修复 Chunjun Oracle LogMiner 问题 一、 技术背景 在大数据实时同步场景中&#xff0c;需要将 Oracle 数据库的变更数据&#xff08;CDC&#xff09; 采集并写入 Apache Doris&am…

M芯片mac安装Linux虚拟机

前沿&#xff1a;之前的mac是intel芯片的&#xff0c;所以这个过程基本没有什么卡点&#xff0c;但23年换了M2的mac&#xff0c;最近有安装linux虚拟机跑一些任务的需求&#xff0c;发现arm芯片由于架构和指令集不一样&#xff0c;原来很多方法都“好像”变复杂了一点点。 1. …

蓝桥杯第十届 特别的数

题目描述 小明对数位中含有 2、0、1、9 的数字很感兴趣&#xff08;不包括前导 0&#xff09;&#xff0c;在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40&#xff0c;共 28 个&#xff0c;他们的和是 574。 请问&#xff0c;在 1 到 n 中&#xff0c;所有这样的数的…

Android设计模式之单例模式

一、定义&#xff1a;确保一个类只有一个实例&#xff0c;并且自动实例化&#xff0c;并向整个系统提供这个实例。 二、使用场景&#xff1a;避免重复创建对象&#xff0c;过多消耗系统资源。 三、使用方式 3.1饿汉式&#xff1a;类加载时立即初始化&#xff0c;线程安全&…

UE4学习笔记 FPS游戏制作20 重写机器人和玩家死亡 切换相机和模型

定义父类中的死亡方法 在父类中定义OnDie方法&#xff0c;不需要实现&#xff0c;由子类实现各自的死亡逻辑 新建一个Die方法&#xff0c;处理公共的死亡逻辑 Die的实现&#xff1a; 以前的分离控制现在要延迟做&#xff0c;如果分离了控制器&#xff0c;就无法再获取到玩家的…

【数学建模】最大最小值模型详解

数学建模中的最大最小值模型详解 文章目录 数学建模中的最大最小值模型详解引言最大最小值模型的基本概念最大化问题最小化问题 常见的求解方法1. 微积分法2. 线性规划3. 非线性规划4. 动态规划 实际应用案例案例1&#xff1a;生产规划问题案例2&#xff1a;投资组合优化 最大最…

OpenCV中直线、曲线和圆的拟合方法

一、直线拟合 ‌最小二乘法直线拟合&#xff08;cv::fitLine&#xff09;‌ ‌原理‌&#xff1a;通过最小化点到直线的垂直距离平方和&#xff0c;计算最优直线参数‌。‌函数参数说明‌&#xff1a; void cv::fitLine(InputArray points, // 输入点集&#xff08;2D或3D&a…