当前位置:首页 > 文章列表 > Golang > Go教程 > Go并发的方法之goroutine模型与调度策略

Go并发的方法之goroutine模型与调度策略

来源:脚本之家 2023-01-01 19:11:04 0浏览 收藏

本篇文章向大家介绍《Go并发的方法之goroutine模型与调度策略》,主要包括goroutine、模型、调度策略,具有一定的参考价值,需要的朋友可以参考一下。

学习刘丹冰《8小时转职golang工程师》,本节都是原理

单进程操作系统

早期的单进程操作系统,可以理解为只有一个时间轴,CPU顺序执行每一个进程/线程,这种顺序执行的方式,CPU同一时间智能处理一个指令,一个任务一个任务去处理

这样就会导致进程阻塞的话,CPU就会卡在当前进程,一直在等待,CPU就会浪费

多线程/多进程操作系统

CPU利用轮询机制,调度各个进程,每个进程都分配固定的时间片,这个时间片很小,先执行进程A,如果A结束了,那没问题切换到下一进程B,但如果时间片内A没结束,CPU不管A没结束,会强制切换到下一进程B,以此类推,CPU就避免了阻塞在某一进程

但这样的问题是,在频繁切换进程的过程中,进程的切换就必然会导致切换成本,例如保存当前线程状态,系统调用,环境的上下文切换,各种拷贝复制就会导致时间浪费,大部分时间都用在切换了,进程数量越多,切换的浪费就越大

因此软件的目标就是提高CPU利用率

另一方面,进程的内存占用也是很大的问题

1:N模型

程序员的任务就是在用户态调接口,开发业务,内核态负责调硬件,调系统资源,用户线程和内核线程一一绑定,CPU只需要管内核线程,这样的内核线程称为thread,用户线程称为co-routine,thread通过管理协程调度器,管理多个协程,这样CPU还是只管理一个线程

在这里插入图片描述

这样就在用户态实现了并发,CPU也不用切换了,只用在协程切换时消耗很少的资源,解决了CPU高消耗调度的问题

这样的弊端是有一个协程阻塞了,下一个协程就不能执行了

M:N模型

M个线程通过协程调度器,管理多个协程,CPU的调度优化我们没法做,这个协程调度器就非常重要了

goroutine

在go中,协程co-routine被改为goroutine,一个goroutine只占几kb,因此可以有大量的goroutine存在,另一方面goroutine 的调度器非常灵活

goroutine早期调度器

早期的goroutine调度器有一个全局的goroutine队列,这个队列有一个锁,每个线程要创建、销毁、运行一个goroutine都要先获取一个锁,然后执行goroutine,执行完毕后再把锁还回去

这样的问题是激烈的锁竞争

另一方面,当一个线程执行一个goroutine时,这个goroutine新创建了一个goroutine,为了保证并发,这个新goroutine肯定得执行,这个新创建的就被放在下一个线程去执行,这实际上不满足程序的局部性原理

另外系统在频繁调用不同的线程还是会造成系统开销

GMP

在操作系统中,有一个操作系统调度器,用来调度CPU,来处理不同的内核线程,在这之上每个线程有一个处理器,这个处理器里有goroutine的各种资源,堆、栈、数据等,这样的处理器称为P,每个P管理一个自己的本地队列,这个队列里存放着这个P要处理的goroutine,goroutine要被处理时,线程获取一个P,P调度出一个goroutine交给线程,线程对goroutine进行处理,除了P的本地队列外,还有一个全局队列,里面也存放着要运行的goroutine

在这里插入图片描述

调度器设计策略

 复用线程

work stealing

当一个线程正在执行一个goroutine时,并且它的P本地队列里还有待执行的goroutine,别的P空闲的话就会帮它的线程偷取一个goroutine

在这里插入图片描述

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

在这里插入图片描述

hand off

如果说一个P正执行的goroutine突然阻塞了,比如在等待输入之类的,那么这时候这个P的线程,也就是这个CPU实际上没有被利用,这时候就会创建/唤醒一个新的线程,这时候让阻塞的goroutine继续阻塞,当前CPU变为睡眠状态,但把物理CPU切换走到不阻塞的线程上,其余的P和P的本地队列直接被转移到新的线程上控制,如果之前的阻塞routine又不阻塞了,那把这个goroutine又加入到别的队列后
在这里插入图片描述

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

在这里插入图片描述

并行

P的数量可以宏定义,例如为CPU核心数/2

抢占

在1:1模型中,一个协程和一个线程绑定,当有别的协程需要运行时,当前的协程除非释放出这个线程资源,否则新来的就只能等着

而goroutine的机制是,每个goroutine只有10ms,时间用完后新的goroutine一定会抢占这个CPU,没有谁优先,大家都很平均

全局队列

在这里插入图片描述

一个线程如果没有要执行的goroutine,根据work stealing,去别的本地队列偷,如果别的队列也没得偷,就去全局队列里拿,全局队列里别的goroutine前移

今天关于《Go并发的方法之goroutine模型与调度策略》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于golang的内容请关注golang学习网公众号!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
Go语言基础go build命令用法及示例详解Go语言基础go build命令用法及示例详解
上一篇
Go语言基础go build命令用法及示例详解
Go语言基础go install命令使用示例详解
下一篇
Go语言基础go install命令使用示例详解
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    29次使用
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    182次使用
  • C-Eval中文评测基准:大语言模型多学科能力评估指南
    C-Eval
    深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
    120次使用
  • AI Prompt Library:免费AI提示词库,助力ChatGPT高效创作与营销
    AI Prompt Library
    探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
    46次使用
  • Generrated:DALL·E 2/3 AI绘画提示词灵感库与图像对比平台
    Generrated
    Generrated汇集9300+张DALL·E生成图像及对应提示词,支持查看完整图集、对比DALL·E 2与3版本差异,是AI绘图新手学习Prompt设计与获取创作灵感的实用工具。
    27次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码