【Go专家编程——协程】

news2024/10/6 16:30:05

1 协程的概念

1.1 基本概念

  • 进程是应用程序的启动实例,每个进程都有独立的内存空间,不同进程通过进程间的通信方式来通信
  • 线程从属于进程,每个进程至少包含一个线程,线程是CPU调度的基本单元,多个线程之间可以共享进程的资源并通过共享内存等线程间的通信方式来通信。
  • 协程可以理解为一种轻量级的线程,协程不受操作系统调度,协程调度器由用户应用程序提供,协程调度器按照调度策略把协程调度到线程中运行。

1.2 协程优势

在高并发应用中频繁创建线程会造成不必要的开销,所以由了线程池技术。使用的时候从中取出,使用完放回即可。
当线程在任务重发生系统调用时,会发生阻塞,则该线程会暂停执行任务。如果大量的线程都发生了系统调用,则会对系统发生阻塞,使任务得不到即使的处理。

  • 增加线程池中线程的数量在一定程度上可以提高处理能力
  • 但线程的增多,也会导致上下文切换的开销变大

那么当发生阻塞时,是否可以将当前任务放在一边,先执行其他任务呢?

  • 工作在用户态的协程可以减少上下文切换的开销
  • 通过协程调度器把可运行的协程逐个调度到线程中执行,同时及时把阻塞的协程调度出协程,从而有效避免了线程的频繁切换
  • 达到使用少量线程实现高并发的效果

2 调度模型

2.1 线程模型

线程可分为用户线程和内核线程,用户线程由用户创建、同步和销毁,内核线程则由内核来管理。根据用户线程管理方式的不同,分为三种线程模型

  • N:1模型
    • 即N个用户线程运行在1个内核线程中,
    • 优点是用户线程上下文切换快
    • 缺点是无法充分利用CPU多核的算力
  • 1:1模型
    • 每个用户线程对应一个线程
    • 优点是充分利用CPU的算力
    • 缺点是线程上下文切换较慢
  • M:N模型
    • Go采用的是前两种模型的组合,M个用户线程(协程)运行在N个线程中
    • 优点充分利用CPU的算力且协程上下文切换快
    • 缺点是该模型的调度算法较为复杂

2.2 Go调度器模型

Go协程调度模型中包含三个关键实体,machine(M),processor(P)和goroutine(简称G)

  • M(machine):工作线程,它由操作系统调度
  • P(processor):处理器(Go定义的一个概念,不是指CPU的个数),包含运行go代码的必要资源,也有调度goroutine的能力
  • G(goroutine):即go协程,每个go关键字都会创建一个协程

相关信息:

  • M必须持有P才可以执行代码
  • M也会被系统调用阻塞
  • P的个数在程序启动时决定,默认情况下等同于CPU的核数。但可以通过GOMAXPROCS这个环境变量指定

一个简单的调度器模型如下图所示:
在这里插入图片描述

  • 上图中包含2个工作线程M
  • 每个M持有一个P
  • 每个M中有一个协程在运行(已标记)
  • 其他背景的协程正在等待被调度,每个处理器P拥有宇哥runqueues队列
  • 此外还有一个全局的runqueues队列,由多个处理器共享

一般来说,处理器P中的协程G额外再创建的协程会被加入到本地的runqueues中;但如果本地的队列已满或阻塞的协程被唤醒,则会放入到全局的runqueues中;处理器除了调度本地的runqueues中的协程,还会周期性地从全局runqueues中摘取协程来调度。

3 调度策略

3.1 队列轮转

  • 每个处理器P维护者一个协程G的队列,处理器P依次将协程G调度到M中执行
  • 协程G执行结束后,处理器P会再次调度一个协程G到M中执行
  • 同时P会周期性查看全局变量中是否有待运行的G,并将其调度到M中运行
  • 全局变量中的G主要来自于系统调用中恢复的G
  • 周期性查看全局队列的目的是为了防止全局队列中的G长时间得不到调度机会而被“饿死”

3.2 系统调用

  • 协程发生系统调度时,对应的工作线程会被阻塞
  • 前面提到P的个数默认等于CPU的个数,每个M必须持有一个P才可以执行G
  • 一般情况下M个的个数会略大于P的个数。
  • 多出来的M将会在G发生系统调用时发生作用。
  • Go也提供了一个M的的池子,需要时从池子中获取,用完放回。不够时再创建。
    在这里插入图片描述
  • 当G0即将进入系统调用时
  • M0释放P
  • 冗余的M1获得P,继续执行P队列中剩下的G(冗余的M的来源可能是缓存池,也可能是新建的)
  • M0由于陷入系统调用而被阻塞,M1接替了M0的工作
  • 只要P不空闲,就可以充分利用CPU
  • 当G0结束系统调用后,根据能否获得P,对G0进行不同的处理
    • 如果有空闲的P,则获取一个P,继续执行G0
    • 如果没有空闲的P,则将G0放入全局队列,等待被其他P调度,然后M0将进入缓冲休眠

3.3 工作量窃取

说白了就是当前P已经将自己队列中的任务全部干完了,而全局队列中又没有新的G。于是从别人的队列中获取一半的工作量。

3.4 抢占式调度

所谓抢占式调度,是指避免某个协程长时间执行,而阻碍其他协程被调用的机制。

  • 调度器会监控每个协程执行的时间
  • 时间过长且有其他协程子在等待时
  • 会把协程暂停,转而调度等待的协程

3.5 GOMAXPROCS对性能的影响

一般来讲,程序运行时就将GOMAXPROCS的大小设置为CPU的核数,可让Go程序充分利用CPU。在某些I/O密集型的应用中,不妨把GOMAXPROCS的值设置得大一些,或许会有更好的效果。

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

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

相关文章

leetcode:计数质数

class Solution { public:// 如果 x 是质数&#xff0c;那么大于 x 的 x 的倍数 2x,3x… 一定不是质数int countPrimes(int n) {vector<int> isPrime(n, 1);int ans 0;for (int i 2; i < n; i) {if (isPrime[i]) {ans 1;if ((long long)i * i < n) {for (int j …

压缩能力登顶 小丸工具箱 V1.0 绿色便携版

平常录制视频或下载保存的视频时长往往都很长&#xff0c;很多时候都想要裁剪、 截取出一些“精华片段”保留下来&#xff0c;而不必保存一整个大型视频那么浪费硬盘空间… 但如今手机或电脑上大多数的视频剪辑软件&#xff0c;切割视频一般都要等待很长时间导出或转换&#…

LBank研究院: DePIN赛道解析|加密精神与Jevons悖论的第三世界

作者&#xff1a;Eva&#xff0c;LBank研究员 *本人谨代表作者观点&#xff0c;不构成任何交易建议。 *本文内容为原创&#xff0c;版权为LBank所有&#xff0c;如需转载请注明作者和出处&#xff0c;否则将追究法律责任。 TLDR: DePIN是对传统老牌硬件的洗牌挑战&#xff…

WWW 2024最佳论文|大型语言模型的机制设计

【摘要】我们研究拍卖机制以支持人工智能生成内容的新兴格式。我们特别研究如何以激励兼容的方式聚合多个法学硕士。在这个问题中&#xff0c;每个代理对随机生成的内容的偏好被描述/编码为 LLM。一个关键动机是为人工智能生成的广告创意设计一种拍卖格式&#xff0c;以结合不同…

兆原数通基于Apache SeaTunnel的探索实践

随着大数据技术的不断发展&#xff0c;数据同步工具在企业中的应用变得愈发重要。为了满足复杂多样的业务需求&#xff0c;找到一款高效、灵活的数据同步工具变得尤为关键。 在这篇文章中&#xff0c;我们将分享兆原数通研发经理李洪军对Apache SeaTunnel的选择、应用及经验。这…

每日一题——博弈论(枚举与暴力)

博弈论 题目描述 运行代码 #include<iostream> #include<vector> using namespace std; int main(){int n;cin >> n;vector<int> d(n,0);for(int i 0;i < n;i){cin >> d[i];}vector<int> in(1000,0);for(int k 1;k<3;k){for(int…

【实战JVM】-基础篇-02-类的声明周期-加载器

【实战JVM】-基础篇-02-类的声明周期-加载器 3 类的生命周期3.1 生命周期的概述3.2 加载阶段3.2.1 查看内存中的对象 3.3 连接阶段3.3.1 验证阶段3.3.1.1 验证是否符合jvm规范3.3.1.2 元信息验证3.3.1.3 验证语义3.3.1.4 符号引用验证 3.3.2 准备阶段3.3.3 解析阶段 3.4 初始化…

从一个时间序列数据中生成一个Markov Transition Field (MTF)

Markov Transition Field&#xff08;马尔科夫转移场&#xff0c;简称MTF&#xff09;是一个用来表示时间序列数据中不同时间点之间状态转移概率的可视化工具。简单来说&#xff0c;它展示了一个时间点上的状态如何可能转移到另一个时间点的状态&#xff0c;这些转移概率是通过…

C语言指针相关知识(第五篇章)(非常详细版)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、sizeof和strlen对比二、数组之间的比较&#xff08;依据strlen和sizeof来呈现&#xff09;&#xff08;一&#xff09;、一维整型数组&#xff08;二&#…

着急联系媒体投稿发表文章有什么好方法?

作为一名曾经的信息宣传员,我深知在紧张的宣传节点上,急于将精心撰写的文章推向更广阔的读者群体,那种紧迫感和焦虑几乎成了常态。记得那段时间,为了能让稿件得到及时有效的曝光,我不得不亲自踏上了一场寻找媒体联系方式的“马拉松”。那时,我手头的资源有限,仅有的几个联系方式…

学 Java 具体能干什么?

学习 Java 后&#xff0c;你可以从事许多不同的工作和项目&#xff0c;涵盖了广泛的应用领域。以下是一些具体的应用场景和工作方向&#xff1a; 1. 企业级应用开发 Java 是企业级应用开发的首选语言之一&#xff0c;特别适合开发大规模、分布式、多层次的企业应用程序。 Jav…

创建列表的艺术:三种实用方法全解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、基础篇&#xff1a;直接使用中括号创建列表 1. 创建空列表 2. 创建包含元素的列表 二…

【经典文献】光-声立体成像:关于系统标定与三维目标重建

论文名称&#xff1a;《Opti-Acoustic Stereo Imaging: On System Calibration and 3-D Target Reconstruction》作者列表&#xff1a;Shahriar Negahdaripour, Hicham Sekkati, and Hamed Pirsiavash作者单位&#xff1a;美国迈阿密大学电气与计算机工程系&#xff0c;佛罗里达…

sourcetree推送到git上面

官网&#xff1a;Sourcetree | Free Git GUI for Mac and Windows 下载到1次提交 下载后打开 点击跳过 下一步 名字邮箱 点击clone 把自己要上传的代码粘贴到里面去 返回点击远程->点击暂存所有 加载完毕后&#xff0c;输入提交内容提交 提交完成了 2次提交 把文件夹内的…

iOS 17.5 release notes

文章目录 iOS 17.5 更新恢复了多年前删除的一些图片新增彩虹壁纸欧盟用户可直接从网站下载应用新增了追踪通知改进 Apple News图书应用"阅读目标"设计更新颜色匹配的播客小部件Web浏览器安全权限的访问下一代“Beats Pill”扬声器在iOS 17.5代码中得到确认店内Vision…

面试被问到不懂的东西,是直接说不懂还是坚持狡辩一下?

大家好&#xff0c;我是瑶琴呀。 面试被问到不懂的东西&#xff0c;是直接说不懂还是坚持狡辩一下&#xff1f;这个问题可以转变一下&#xff0c;如果你顺利拿到 offer&#xff0c;公司安排的工作跟你之前的技术和经验不匹配&#xff0c;你还愿意干下去吗&#xff1f; 转变一…

基于Vue+SpirngBoot的博客管理平台的设计与实现(论文+源码)_kaic

摘 要 随着当下社会的发展&#xff0c;互联网已经成为时代的主流&#xff0c;从此进入了互联网时代&#xff0c;对大部分人来说&#xff0c;互联网在日常生活中的应用是越来越频繁&#xff0c;大家都在互联网当中互相交流、学习、娱乐。博客正是扮演这样一个角色。博客已成为当…

Docker 安装kingbase V8r6

下载 官网下载&#xff0c;注意&#xff1a;这里下载 Docker 版本v8r6 安装 # 导入镜像 docker load -i kingbase.tar# 重命名 docker tag [image-name]:[tag] [new-image-name]:[new-tag]# 删除 docker rmi [image-name]:[tag]# 创建容器 docker run -tid \ --privileged \…

计算机毕业设计 | SpringBoot招投标 任务发布网站(附源码)

1&#xff0c;绪论 在市场范围内&#xff0c;任务发布网站很受欢迎&#xff0c;有很多开发者以及其他领域的牛人&#xff0c;更倾向于选择工作时间、工作场景更自由的零工市场寻求零散单子来补贴家用。 如今市场上&#xff0c;任务发布网站鱼龙混杂&#xff0c;用户需要找一个…