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

go语言协程调度器 GPM 模型

go语言协程调度器 GPM 模型

下面的文章将以几个问题展开,其中可能会有扩展处:

  1. 什么是调度器?为什么需要调度器?

  2. 多进程/多线程时cpu怎么工作?

  3. 进程/线程的数量多多少?太多行不行?为什么不行?那怎么解决?

  4. 什么是协程?协程和线程/进程的区别?协程加入的作用?为什么会有这样的作用?

  5. GPM模型的结构?怎么设计的?各部分的作用?各部分间怎么协作?

调度器由来

单进程时代,所有程序几乎都是阻塞的。只能一个任务一个任务执行。那么在计算机处理流程中会有多个硬件的支持和处理,cpu、cache、主内存、磁盘、网络等。比如:但是当任务执行到磁盘时,需要加载磁盘数据,此时流程阻塞,导致cpu处于等待状态,那么这对于cpu来说就是资源浪费。理应让cpu在这时去处理其他任务。又因为单进程下多任务也会阻塞,由此出现了多进程/多线程。为了极大发挥cpu等资源。我们需要有一个监听通知机制或者说算法,监听cpu状态并告知cpu执行哪一个任务。

多进程/多线程时cpu工作方式

为了实现在宏观角度上多个进程/线程一起执行的目标,需要一个调度器,通过分时的机制,在不同的时间轴上执行不同的进程/线程。

多进程/线程的烦恼

假设在linux系统下,linux对待进程和线程是一样的。

假设,一个程序提供了一个服务。当并发量很小时,我们创建了较多的进程和线程,我们发现:整体的处理响应速度提高、应对并发量的阈值提高。当并发量很大时,我们创建了大量的进程和线程,此时我们发现:这个整体的响应反而比之前的慢,那按道理应该是相同的处理响应时间。

这是为何呢?

这是因为进程和线程的大量创建,cpu的资源大量用到了进程/线程的创建、进程/线程间切换、进程/线程销毁等与业务无关的操作。使得真正用到业务的cpu资源减少。还有内存的高占用,导致整体性能下降。

那么怎么解决呢?

这时出现了协程。

协程

协程其实是一种“用户态”的线程。(之后我们把”线程“都看作“内核级线程”),协程必须绑定线程才可以正常运行。那怎么绑定?方式上?数量上?

绑定方式和数量

N : 1 关系

N个协程由一个协程调度器调度,和一个线程绑定

缺点:

一个协程阻塞,整个线程也就阻塞了

1 : 1 关系

协程和线程 1 : 1 绑定,协程的调度也由cpu完成

缺点:

cpu又负责协程的创建、切换、销毁,增加了cpu的负担

M : N 关系

克服以上的问题。用户态调度器负责协程的创建,协程阻塞会主动让出线程,使得有新的协程可以和线程绑定,执行其他任务。

综上,那么在 M : N 的关系中,怎么实现一个协程调度器是至关重要的,因为他会基于协作式的调度策略负责与线程的解绑定,影响执行效率

在介绍完整个的调度器、协程后,我们来认识 go 语言中的协程和调度器

Go协程

go协程基于协程的思想,是一种用户级线程。由 runtime 调度,初始占用极小,但是可以动态的扩容。

扩展:

runtime 是 Go 语言的核心运行时环境,负责管理内存分配、垃圾回收(GC)、协程调度、系统调用等底层操作。其中,协程调度器 是 runtime 的关键组件之一,负责 Goroutine 的创建、销毁和调度。

GPM 模型

首先,需要明白的是:gpm模型是go语言实现的一种用户空间的协程调度器,是 runtime包 的核心组件之一

GPM 模型的成员

G:goroutine协程,用户空间。协程实体,保存执行上下文(栈、PC 指针等),初始栈 2KB,动态扩缩容

P:processor处理器,用户空间。是 Go 运行时在用户空间抽象出的调度上下文,负责承载 Goroutine 队列和执行环境,数量由 GOMAXPROCS 控制

M:(machine)thread线程,内核空间。实际执行代码的内核线程,必须绑定 P 才能运行 G(实际上,这里就是将之前的 “协程→线程” 直接绑定关系,抽象为 “协程→P→线程” 的间接绑定)

扩展:相比于之前直接绑定关系,这样的间接绑定的好处是什么?

一、抽象层级的对比
模型绑定关系调度灵活性资源利用率
传统 N:1协程 → 单线程极低单核利用
传统 1:1协程 → 专用线程高(但开销大)
Go GPM(M:N)协程 → P → 动态绑定线程极高高且开销低
二、引入 P 的核心优势
  1. 解耦协程与线程的强绑定
  • 传统模式问题
    在 1:1 模式下,协程阻塞会导致对应线程阻塞,即使系统中存在其他可运行的协程。

  • GPM 解决方案

    P 作为 “执行上下文”,可在不同 M 间动态迁移。当 G 阻塞时,P 与当前 M 解绑,转移到其他空闲 M 继续执行队列中的 G。

    // 示例:当 G1 执行阻塞操作时
    go func() { // G1resp, _ := http.Get("https://example.com") // 阻塞调用// ...
    }()go func() { // G2// 即使 G1 阻塞,P 可调度 G2 在其他 M 上执行
    }()
    
  1. 减少锁竞争,提升并发性能
  • 全局队列瓶颈
    早期 Go 版本(<=1.0)仅使用全局运行队列,所有 M 竞争同一个队列,锁冲突严重。

  • P 的本地队列

    每个 P 维护自己的本地队列(LRQ),M 优先从本地队列获取 G,大幅减少锁争用。

    • 工作窃取:当本地队列空时,M 从其他 P 的队列 “偷取” G,负载均衡更高效。
  1. 优化系统调用处理
  • 非阻塞系统调用
    通过 netpoller(基于 epoll/kqueue)实现 IO 多路复用,M 无需阻塞等待,可继续执行其他 G。

  • 阻塞系统调用

    当 G 执行阻塞调用时,M 释放 P,允许其他 M 接管 P 继续工作。调用完成后,G 重新加入某个 P 的队列。

    // 底层逻辑简化示意
    func syscallRead(fd int) {g := getg()g.m.p.ptr().syscallentering(g) // P 准备进入系统调用// 执行内核调用...g.m.p.ptr().syscallexiting(g)  // P 退出系统调用,重新分配
    }
    
  1. 控制并行度,避免过度并发
  • GOMAXPROCS
    

    限制活跃 P 的数量,从而控制实际并行执行的协程数。

    • 对于 CPU 密集型任务,设置 GOMAXPROCS=CPU核数 可充分利用硬件资源。
    • 对于 IO 密集型任务,可设置更大的 GOMAXPROCS,但需权衡线程切换开销。
三、对比实验:P 的性能影响

以下是不同 GOMAXPROCS 设置下的性能测试(数据为示意):

GOMAXPROCS吞吐量(req/s)平均延迟(ms)线程数
110,00052-3
435,00044-6
1638,000616-20
  • 结论
    • 增加 P 数量(≤CPU 核数)可提升并行度,但超过核数后收益递减,甚至因线程切换开销导致性能下降。
四、总结:P 的设计哲学

P 的引入本质是在用户空间实现了一个轻量级的虚拟 CPU 管理系统

  • 将调度决策(如 G 的选择、负载均衡)从内核转移到用户空间,减少内核干预;
  • 通过本地队列和工作窃取算法,最小化锁竞争(对全局队列来说);
  • 动态绑定机制使资源利用更高效,尤其适合高并发 IO 场景。

这种设计让 Go 既能支持百万级协程,又能高效利用多核 CPU,成为构建云原生应用的理想语言。

GPM 模型结构介绍

  1. 全局队列:负责存放等待运行的协程。协程来源:各自处理器下协程创建满了就拿一半放到全局队列。协程去处:处理器本地队列的协程不够了就从全局队列拿取。特点:全局资源,任何读写操作都是要互斥的(上锁)。
  2. P:处理器。对上负责调度协程,向下负责绑定线程。维护一个本地的协程队列,有利于细锁化。特点:协程偷取机制、动态绑定线程。
  3. M:负责从P中获取协程执行任务。触发P的偷取机制、从全局队列取协程动作

GMP 模型的调度策略的介绍

  1. 线程复用:比如在GPM模型中,当线程出现空闲或阻塞状态时分别会触发偷取机制移交机制。使得充分利用线程,避免大量创建和销毁线程。
  2. 并行:P 的数量决定了并行量。cpu核数决定了 P 的数量。推荐最大的 P = 核数/2
  3. 混合协程工作策略:抢占式 + 协作式。协作式:当goroutine出现阻塞,协程主动让出,P 解绑定,然后和其他空闲线程绑定。抢占式:一个go程最大运行时长为10ms(go1.14后新增),调度器通过 SIGURG 信号强制中断其执行,go程主动释放 P
  4. 全局G队列:本地队列为空,优先从全局队列取,如果没有则“偷取”。本地队列过多,向全局队列输送协程。

GPM 模型的调度器生命周期

在 Go 语言调度器的 GPM 模型中还有两个比较特殊的角色,它们分别是 M0 和 G0。

  1. M0
    • 启动程序后的编号为 0 的主线程。
    • 在全局命令 runtime.m0 中,不需要在 heap 堆上分配。
    • 负责执行初始化操作和启动第 1 个 G。
    • 启动第 1 个 G 后,M0 就和其他的 M 一样了。
  2. G0
    • 每次启动一个 M,创建的第 1 个 Goroutine 就是 G0。
    • G0 仅用于负责调度 G。
    • G0 不指向任何可执行的函数。
    • 每个 M 都会有一个自己的 G0。
    • 在调度或系统调度时,会使用 M 切换到 G0,再通过 G0 调度
    • M0 的 G0 会放在全局空间。
初始化阶段
  1. 创建最初的 M0 和 G0,并将二者关联。
  2. 初始化 M0、栈、垃圾回收,以及创建和初始化由 GOMAXPROCS 个 P 构成的 P 列表
作用阶段
  1. runtime.main函数开始,(创建 Main Goroutine)调用 main.main 函数, 将 Main Goroutine 放到 P 的本地队列。
  2. 启动 M0 ,M0 从 P 中获取 Main Goroutine 。(由于 G 拥有栈,M 根据 G 的栈信息和调度信息设置运行环境)然后运行,最后(如果还有待执行的go程)继续从 P 队列获取go程执行,直到 Main Goroutine 结束。最后 runtime.main 执行 Defer 和 Panic 或者 runtime.exit 结束。

GPM 模型调度的场景举例

  1. go程1 创建 go程2,优先加入本地队列
  2. G0 和 G1的切换,当 M 上的 G1 执行完,自动切换回 G0
  3. 开辟过多 G ,拿出前一半的go程和新创建的go程放到全局队列
  4. 新创建的 go程 可以唤醒空闲的 mp 组合执行任务
  5. 当一个 mp 组合没有g执行时,p 就会调度 G0线程。此时 M、P、G0组合被称为 自旋线程
  6. 自旋线程寻找可执行的 G 优先从全局队列获取
  7. 自旋线程寻找可执行的 G 最后从其他队列偷取
  8. 阻塞线程和 P 解绑,然后 P 和其他 可运行的M绑定。
  9. 之前与 P 绑定的 M 非阻塞后,P 会尝试与 M 重新绑定。如果 P 正在和其他 M 绑定 或者 全局空闲 P 队列为空,那么 M 进入空闲线程队列,进入休眠(最后可能被 gc)

相关文章:

go语言协程调度器 GPM 模型

go语言协程调度器 GPM 模型 下面的文章将以几个问题展开&#xff0c;其中可能会有扩展处&#xff1a; 什么是调度器&#xff1f;为什么需要调度器&#xff1f; 多进程/多线程时cpu怎么工作&#xff1f; 进程/线程的数量多多少&#xff1f;太多行不行&#xff1f;为什么不行&…...

Python打卡 DAY 29

知识点回顾 1. 类的装饰器 2. 装饰器思想的进一步理解&#xff1a;外部修改、动态 3. 类方法的定义&#xff1a;内部定义和外部定义 作业&#xff1a;复习类和函数的知识点&#xff0c;写下自己过去29天的学习心得&#xff0c;如对函数和类的理解&#xff0c;对python这门工…...

C++控制结构详解:if-else、switch、循环(for/while/do-while)

1. 引言 在C编程中&#xff0c;控制结构用于控制程序的执行流程。它们决定了代码在什么条件下执行、如何重复执行某段代码&#xff0c;以及如何选择不同的执行路径。C提供了多种控制结构&#xff0c;主要包括&#xff1a; 条件语句&#xff1a;if-else、switch-case循环语句&…...

APP手机端测试覆盖点

通过上图&#xff0c;我们覆盖了完整的一个APP&#xff0c;需要进行哪些测试...

C++:⾯向对象的三⼤特性

面向对象的三大特性&#xff1a; 继承&#xff1a;允许一个类&#xff08;子类 / 派生类&#xff09;继承另一个类&#xff08;父类 / 基类&#xff09;的属性和方法&#xff0c;实现代码复用和层次化设计。 封装&#xff1a;将数据&#xff08;成员变量&#xff09;和操作数据…...

三、高级攻击工具与框架

高级工具与框架是红队渗透的核心利器&#xff0c;能够实现自动化攻击、权限维持和隐蔽渗透。本节聚焦Metasploit、Cobalt Strike及企业级漏洞利用链&#xff0c;结合实战演示如何高效利用工具突破防御并控制目标。 1. Metasploit框架深度解析 定位&#xff1a;渗透测试的“瑞…...

玄机-第二章日志分析-redis应急响应

前言 记录记录 关于redis的一些手法 redis未授权访问漏洞利用redis写webshell利用“公私钥” 认证获取root权限利用crontab反弹shellredis日志: /var/log/redis.log 1. 通过本地 PC SSH到服务器并且分析黑客攻击成功的 IP 为多少,将黑客 IP 作为 FLAG 提交; cd /var/log 查看…...

MoodDrop:打造一款温柔的心情打卡单页应用

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起心动念&#xff1a;我想做一款温柔的情绪应用 「今天的你&#xff0c;心情如何&#xff1f;」 有时候&#x…...

Web开发-JavaEE应用SpringBoot栈SnakeYaml反序列化链JARWAR构建打包

知识点&#xff1a; 1、安全开发-JavaEE-WAR&JAR打包&反编译 2、安全开发-JavaEE-SnakeYaml反序列化&链 一、演示案例-WEB开发-JavaEE-项目-SnakeYaml序列化 常见的创建的序列化和反序列化协议 • &#xff08;已讲&#xff09;JAVA内置的writeObject()/readObje…...

RISC-V 开发板 MUSE Pi Pro V2D图像加速器测试,踩坑介绍

视频讲解&#xff1a; RISC-V 开发板 MUSE Pi Pro V2D图像加速器测试&#xff0c;踩坑介绍 今天测试下V2D&#xff0c;这是K1特有的硬件级别的2D图像加速器&#xff0c;参考如下文档&#xff0c;但文档中描述的部分有不少问题&#xff0c;后面会讲下 https://bianbu-linux.spa…...

学习!FastAPI

目录 FastAPI简介快速开始安装FastApiFastAPI CLI自动化文档 Reqeust路径参数Enum 类用于路径参数路径参数和数值校验 查询参数查询参数和字符串校验 请求体多个请求体参数嵌入单个请求体参数 CookieHeader表单文件直接使用请求 ResponseResponse Model多个关联模型 响应状态码…...

【Python 算法零基础 4.排序 ① 选择排序】

就算经历各番碰撞&#xff0c;幸运也将一直站在我这边 —— 25.5.18 一、引言 选择排序(Selection Sort) 是一种简单直观的排序算法。它首先在未排序序列中找到最小(大)元素&#xff0c;存放到排序序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小…...

05 部署Nginx反向代理

01 服务器基本信息 名称IP地址真实Web服务器172.2.25.10Proxy服务器172.2.25.11 02 Proxy基本设置 [rootlikexy-nginx-01 conf.d]# pwd /etc/nginx/conf.d [rootlikexy-nginx-01 conf.d]# cat proxy.conf server {listen 80;server_name www.wp.proxy.com;location / {prox…...

通俗解释Transformer在处理序列问题高效的原因(个人理解)

Transformer出现的背景 CNN 的全局关联缺陷卷积神经网络&#xff08;CNN&#xff09;通过多层堆叠扩大感受野&#xff0c;但在自然语言处理中存在本质局限&#xff1a; 局部操作的语义割裂&#xff1a;每个卷积核仅处理固定窗口&#xff08;如 3-5 词&#xff09;&#xff0c;…...

【Vue】路由1——路由的引入 以及 路由的传参

目录 一、什么是路由 &#xff01; 1.1 一个完整的前端路由规则​编辑 1.2 后端路由 1.3 安装路由插件 1.4 嵌套&#xff08;多级&#xff09;路由 二、路由的query传参 2.1 传参 2.2 取值 三、命名路由 四、 路由的params参数 五、路由的props配置 第一种写法&…...

大模型为什么学新忘旧(大模型为什么会有灾难性遗忘)?

字数&#xff1a;2500字 一、前言&#xff1a;当学霸变成“金鱼” 假设你班上有个学霸&#xff0c;数学考满分&#xff0c;英语拿第一&#xff0c;物理称霸全校。某天&#xff0c;他突然宣布&#xff1a;“我要全面发展&#xff01;从今天起学打篮球&#xff01;” 一周后&am…...

07 负载均衡

01 面试题 面试题: 说一下如何实现的负载均衡 1.使用的proxy_pass模块 2.通过proxy_pass模块转发给upstream模块定义的地址池 3.使用的是默认的rr轮训算法分发到后端的服务器02 负载均衡配置 # 写一个简单的配置 [rootlikexy-nginx-01 conf.d]# cat lb.conf server {listen …...

谢赛宁团队提出 BLIP3-o:融合自回归与扩散模型的统一多模态架构,开创CLIP特征驱动的图像理解与生成新范式

BLIP3-o 是一个统一的多模态模型&#xff0c;它将自回归模型的推理和指令遵循优势与扩散模型的生成能力相结合。与之前扩散 VAE 特征或原始像素的研究不同&#xff0c;BLIP3-o 扩散了语义丰富的CLIP 图像特征&#xff0c;从而为图像理解和生成构建了强大而高效的架构。 此外还…...

【深度学习】残差网络(ResNet)

如果按照李沐老师书上来&#xff0c;学完 VGG 后还有 NiN 和 GoogLeNet 要学&#xff0c;但是这两个我之前听都没听过&#xff0c;而且我看到我导师有发过 ResNet 相关的论文&#xff0c;就想跳过它们直接看后面的内容。 现在看来这不算是不踏实&#xff0c;因为李沐老师说如果…...

最新最热门的特征提取方式:CVOCA光学高速复值卷积

目录 一、问题背景与核心挑战 二、CVOCA核心原理与数学建模 1. 复杂值卷积的数学表达 2. CVOCA的三大光学映射策略 三、关键创新点详解 1. 合成波长技术(Synthetic Wavelength) 2. 复杂值电光调制器(CVEOM) 3. 时间-波长交织卷积计算 四、代码实现与仿真验证 1. …...

获取Class的方式有哪些?

在Java中&#xff0c;获取Class对象是进行反射操作的基础&#xff0c;以下是几种常见方式及其详细说明&#xff0c;以及记忆方法&#xff1a; 1. 使用 .class 语法 语法&#xff1a;类名.class&#xff08;如 String.class&#xff09;。特点&#xff1a; 编译时确定&#xff…...

STM32八股【9】-----volatile关键字

一句话&#xff1a; 主要是为了防止编译器优化导致无法得到最新的值。主要用于以下三处&#xff1a; 1.在中断中修改访问的变量。 2.多任务&#xff08;线程&#xff09;共享的变量。 3.硬件寄存器变量 问题 嵌入式程序中常出现变量值改变但代码未正确响应的现象 原因 编译…...

【android bluetooth 协议分析 01】【HCI 层介绍 4】【LeSetEventMask命令介绍】

在蓝牙协议栈中&#xff0c;HCI_LE_Set_Event_Mask 是一个主机控制接口&#xff08;HCI&#xff09;层的命令&#xff0c;属于 LE&#xff08;Low Energy&#xff09;控制指令集。该命令用于 配置控制器向主机报告哪些 LE 事件&#xff0c;以便主机能够根据需求控制被中断的事件…...

关于文件分片的介绍和应用

文件分片&#xff0c;顾名思义&#xff0c;就是将一个大文件分割成多个小的文件块&#xff08;chunk&#xff09;。每个文件块都是原始文件的一部分&#xff0c;并可以通过特定的方式将这些小文件块重新组装成原始文件。 1. 基本原理: 文件分片从底层来看&#xff0c;主要是对…...

tauri2项目动态添加 Sidecar可行性方案(运行时配置)

tauri2官方文档&#xff1a;Embedding External Binaries | Tauri Tauri 的 Sidecar 功能允许你将外部二进制文件&#xff08;External Binaries&#xff09;与你的 Tauri 应用程序捆绑在一起&#xff0c;并在运行时调用它们。根据你提供的链接和 Tauri 的文档&#xff0c;以下…...

20倍云台球机是一种高性能的监控设备

20倍云台球机是一种高性能的监控设备&#xff0c;其主要特点包括20倍光学变焦能力和云台旋转功能。以下是对20倍云台球机的详细分析&#xff1a; 一、主要特点 20倍光学变焦 &#xff1a; 摄像机镜头能够在保持图像清晰度的前提下&#xff0c;将监控目标放大20倍。 这一功能…...

利用html制作简历网页和求职信息网页

前言 大家好&#xff0c;我是maybe。今天下午初步学习了html的基础知识。做了两个小网页&#xff0c;一个网页是简历网页&#xff0c;一个网页是求职信息填写网页。跟大家分享一波~ 说明:我不打算上传图片。所以如果有朋友按照我的代码运行网页&#xff0c;会出现一个没有图片…...

三:操作系统线程管理之线程概念

揭秘幕后英雄&#xff1a;理解线程的奥秘与优势 在当今软件应用的世界里&#xff0c;流畅的用户体验、高效的后台处理以及强大的并发能力已经成为必备的要求。你有没有想过&#xff0c;一个看似简单的程序是如何在同一时间处理多个任务的&#xff1f;或者为什么一个复杂的应用…...

学习黑客Active Directory 入门指南(一)

Active Directory 入门指南&#xff08;一&#xff09;&#xff1a;初识AD与核心概念 &#x1f511; 大家好&#xff01;欢迎来到 “Active Directory 入门指南” 系列的第一篇。在本系列中&#xff0c;我们将逐步深入探索 Windows Active Directory (AD)——微软推出的目录服…...

单列集合——ArrayList,LinkedList,迭代器的底层原理和源码

ArrayList 底层原理 空参构造创建集合时候&#xff0c;创建长度为零的数组名叫elementData&#xff0c;还有个成员变量size用来记录元素的个数&#xff0c;第一次空参&#xff0c;size长度是0。 添加第一个元素时&#xff0c;底层创建新的长度尾10的数组&#xff0c;数组中默认…...

C++模板进阶使用技巧

非类型模板参数缺省模板参数类模板特化全特化偏特化 模板的分离编译 我们在前面已经初识了 模板并且在各种数据结构的实现中&#xff0c;熟练掌握了模板的一些基础功能。 至于为什么是基础功能&#xff0c;因为模板还有一些进阶的功能&#xff0c;像非类型模板参数&#xff0c…...

jqGrid冻结列错行问题,将冻结表格(悬浮表格)与 正常表格进行高度同步

在使用jqGrid时&#xff0c;如果你遇到了冻结列&#xff08;也称为冻结表格或悬浮表格&#xff09;与正常表格高度不同步的问题&#xff0c;这通常是由于CSS样式或者布局管理不当所导致的。下面是一些解决此问题的步骤和建议&#xff1a; 1. 确保CSS样式正确 首先&#xff0c;确…...

Milvus(25):搜索迭代器、使用分区密钥

1 搜索迭代器 ANN Search 对单次查询可调用的实体数量有最大限制&#xff0c;因此仅使用基本 ANN Search 可能无法满足大规模检索的需求。对于 topK 超过 16,384 的 ANN Search 请求&#xff0c;建议考虑使用 SearchIterator。 1.1 概述 Search 请求返回搜索结果&#xff0c;而…...

深入探索PointNet:点云处理的革命性算法

深入探索PointNet&#xff1a;点云处理的革命性算法 在计算机视觉和三维图形处理领域&#xff0c;点云数据的处理一直是一个极具挑战性的任务。点云数据由一系列三维坐标点组成&#xff0c;这些点通常来源于激光雷达&#xff08;LiDAR&#xff09;、三维扫描仪等设备。与图像数…...

四品种交易策略

策略概述 策略思路: 交易品种:同时交易四个品种,每个品种使用总资金的10%。 合约选择:使用连续合约(data0)发出交易信号,实际交易 主力合约(data1)和下一个主力合约(data2)。 资金管理:总资金用A_CurrentEquity表示,交易手数据此计算。 止损执行:盘中达到止损…...

NC61 两数之和【牛客网】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 排序双指针3.1 散列 四、参考代码4.1 排序双指针4.2 散列 零、原题链接 NC61 两数之和 一、题目描述 二、测试用例 三、解题思路 3.1 排序双指针 基本思路&#xff1a;   先对序列进行排序&#xff0c;然后…...

电子电路:什么是电流离散性特征?

关于电荷的量子化,即电荷的最小单位是电子的电荷量e。在宏观电路中,由于电子数量极大,电流看起来是连续的。但在微观层面,比如纳米器件或单电子晶体管中,单个电子的移动就会引起可观测的离散电流。 还要提到散粒噪声,这是电流离散性的表现之一。当电流非常小时,例如在二…...

如何完美安装GPU版本的torch、torchvision----解决torch安装慢 无法安装 需要翻墙安装 安装的是GPU版本但无法使用的GPU的错误

声明&#xff1a; 本视频灵感来自b站 如何解决所述问题 如何安装对应版本的torch、torchvison 进入pytorch官网 进入历史版本 这里以cuda11.8 torch 2.1.0为例演示 根据文档找到要安装的torch、torchvison版本 但不是使用命令行直接安装 命令行直接安装可能面临着 安装慢…...

Fine-Tuning Llama2 with LoRA

Fine-Tuning Llama2 with LoRA 1. What is LoRA?2. How does LoRA work?3. Applying LoRA to Llama2 models4. LoRA finetuning recipe in torchtune5. Trading off memory and model performance with LoRAModel ArgumentsReferences https://docs.pytorch.org/torchtune/ma…...

Compose笔记(二十五)--Brush

这一节主要了解一下Compose中Brush,在Jetpack Compose里&#xff0c;Brush是一个重要的 API&#xff0c;它用于定义填充图形的颜色渐变或图案&#xff0c;能够为界面元素添加丰富的视觉效果。简单总结如下: 1 常见场景 填充形状&#xff08;圆形、矩形等&#xff09; 创建渐变…...

访问共享打印机提示错误0x00000709多种解决方法(支持win10和win11)

在日常办公和生活中&#xff0c;打印机是不可或缺的重要设备。然而&#xff0c;有时在连接打印机的过程中&#xff0c;我们可能会遇到错误代码0x00000709的提示。有更新补丁导致的、有访问共享打印机服务异常、有访问共享打印机驱动异常等问题导致的&#xff0c;针对访问共享打…...

【Mini 型 http 服务器】—— int get_line(int sock, char *buf, int size);

作用&#xff1a; 逐行读取并返回读取的内容长度&#xff0c;取出读取的内容保存在 buf 数组中 输入&#xff1a; int sock&#xff1a;需要读取的 sock 套接字 char *buf&#xff1a;用于记录保存读取的内容 int size&#xff1a;buf 的大小 返回值&#xff1a; -1 表示 读取…...

Window远程连接Linux桌面版

Window远程连接Linux桌面版 卸载RealVNC Server 一、确认是否安装了 VNC Server 先检查是否已安装&#xff1a; which vncserver # 或 dpkg -l | grep vnc # 或 rpm -qa | grep vnc二、在 Debian / Ubuntu 上卸载&#xff08;.deb 安装&#xff09; 1. 卸载 RealVNC Serve…...

计算机系统---TPU(张量处理单元)

一、定义与定位 TPU&#xff08;Tensor Processing Unit&#xff09; 是由Google开发的专用AI加速芯片&#xff0c;专为深度学习中的张量运算&#xff08;如矩阵乘法、卷积&#xff09;设计&#xff0c;属于ASIC&#xff08;专用集成电路&#xff09;范畴。其核心目标是在算力…...

5.18 day24

知识点回顾&#xff1a; 元组可迭代对象os模块 作业&#xff1a;对自己电脑的不同文件夹利用今天学到的知识操作下&#xff0c;理解下os路径。 元组 元组的特点&#xff1a; 有序&#xff0c;可以重复&#xff0c;这一点和列表一样 元组中的元素不能修改&#xff0c;这一点…...

Filament引擎(一) ——渲染框架设计

filament是谷歌开源的一个基于物理渲染(PBR)的轻量级、高性能的实时渲染框架&#xff0c;其框架架构设计并不复杂&#xff0c;后端RHI的设计也比较简单。重点其实在于项目中材质、光照模型背后的方程式和理论&#xff0c;以及对它们的实现。相关的信息&#xff0c;可以参考官方…...

区间带边权并查集,XY4060泄露的测试点

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 码蹄集 二、解题报告 1、思路分析 关于带边权并查集&#xff1a;并查集&…...

虚幻引擎5-Unreal Engine笔记之Pawn与胶囊体的关系

虚幻引擎5-Unreal Engine笔记之Pawn与胶囊体的关系 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之Pawn与胶囊体的关系1. 什么是Pawn&#xff1f;2. 什么是胶囊体&#xff08;Capsule Component&#xff09;&#xff1f;3. Pawn与胶囊体的具体关系&#xff08;1&#x…...

USB学习【11】STM32 USB初始化过程详解

1.USB HAL库里面的结构体 为了管理USB&#xff0c;HAL首先构建了一下几个结构体 1.1 USBD设备结构体 USB用到的全局变量&#xff0c;保存了USB生命周期的全部信息。 1.2 USBD PCD底层硬件操作相关结构体 1.3 USB 配置结构体 USB速度、PHY接口类型、端点0参数等 1.4 端点配置…...

Estimation(估算):业务分析师的“不确定性对抗术”

在变化中给出最靠谱的预判。 当面对项目排期模糊、资源计划混乱、老板催问“多久能搞定”的时候&#xff0c; 我总会说&#xff1a;“别着急&#xff0c;我们先做个 Estimation。” 因为&#xff0c;没有靠谱的估算&#xff0c;承诺和资源分配就是空中楼阁。 什么是 Estimati…...