首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >golang 重要知识:golang 调度

golang 重要知识:golang 调度

原创
作者头像
lincoln
修改于 2021-07-30 02:27:54
修改于 2021-07-30 02:27:54
1.2K0
举报
文章被收录于专栏:后端后端

摘要

Go 的调度机制相当于我们微服务里的基础组件。很多运行时操作都涉及到了调度的关联。本文会细聊调度概念,策略,以及它的机制。当然,也少不了最常提及的 GMP 模型。

一、调度是什么?

计算机的资源有限的,像 CPU,内存都是固定的。但是同一时间可能会有多个任务要去完成,比如操作系统的定时监控,用户程序的运行等。

怎么让资源最大化的完成任务,这是调度需要考虑的关键点。

调度可以理解为一个指挥员,指导我们的程序按照一定的规则去获取资源,然后去执行里面的指令。

调度分配
调度分配

那么,一般的规则有哪些呢?

常见的调度策略有 2 种,一种是协作式调度,会让程序顺利的完成自己的任务,再把资源腾出来给其他程序使用。

另一种是抢占式调度,也就是让程序按一定的时间去占有这些资源,时间到了就被迫让出现有资源,给其他的程序轮流使用。

协作式调度有利于程序专注的完成自己的任务,但也可能会造成其他程序一直饿死,得不到执行。

协作式调度
协作式调度

抢占式调度有利于程序在资源的利用上雨露均沾,但是在不断的切换过程中,将会使得程序原本 10 ms 能完成的事,不得不延迟多几 ms。

抢占式调度
抢占式调度

注:Linux 操作系统也是采用了抢占式调度,并且使用了 CFS:完全公平调度算法。通过对程序大致的运行时间来平衡调度,让越没有执行过的程序,越快被调度到。

当前大多数操作系统都是采用抢占式调度来执行程序的,毕竟很多操作系统都是面向用户,需要很高的响应速度,而且只要切换程序的周期够短,例如 50ms,那对于用户来讲,就像没切换一样。

二、golang 的调度

上面提及到抢占式调度会有个频繁切换的过程,在切换时,需要不断的保存或恢复上下文信息。

而这会涉及到操作系统内核态和用户态的切换,性能损耗会很大。

对此,golang 实现了属于自己的调度模型,采用了基于协作的抢占式调度。之所以是"协作"的,是因为 Go 的调度时机是由用户自己设置的,而这里的用户指的是 golang 的运行时 runtime

它会在下面的事件发生时进行调度触发:

使用关键字 go 垃圾回收 系统调用,如访问硬盘 同步阻塞调用,如 使用 mutex、channel

如果上面什么事件都没发生,则会有 sysmon 来监控 goroutine 的运行情况,对长时间运行的 goroutine 进行标记。一旦 goroutine 被标记了,那么它就会下次发生函数调用时,将自己挂起,再触发调度。

这里需要说明下的是,runtime 它相当于 Java 的虚拟机,负责了 Go 的很多东西,例如调度垃圾回收、内存管理等,可以说是涵盖了 Go 的基础引擎了。

更重要的是 runtime 是运行在用户态上的,相当于 Go 的调度是在用户态这一层进行的。

这样,每当 Go 有调度产生时,就不会伴随着用户态和内核态的切换,而是像前面提到过的策略那样去触发调度,这就降低了并发时的内核态与用户态的切换成本了。

三、golang 的 GPM 模型

为了实现 golang 的调度,golang 抽象出了三个结构,也就是我们常见的 G、P、M

G:也就是协程 goroutine,由 Go runtime 管理。我们可以认为它是用户级别的线程。

goroutine 非常的轻量,初始分配只有 2KB,当栈空间不够用时,会自动扩容。同时,自身存储了执行 stack 信息、goroutine 状态以及 goroutine 的任务函数等。

P:processor 处理器。P 的数量默认跟 CPU 的核心数一样,如果是多核的 CPU,则会有多个 P 会被创建。

每当有 goroutine 要创建时,会被添加到 P 上的 goroutine 本地队列上,如果 P 的本地队列已满,则会维护到全局队列里。

在进行调度时,会优先从本地队列获取 goroutine 来执行。

如果本地队列没有,会从其他的 P 上偷取 goroutine。

如果其他 P 上也没有,则会从全局队列上获取 goroutine。

这样通过上面的策略,就能尽最大努力保证有 goroutine 可运行

M:系统线程。在 M 上有调度函数,它是真正的调度执行者,M 需要跟 P 绑定,并且会让 P 按上面的原则挑出个 goroutine 来执行。

M 虽然从 P 上挑选了 G 执行,但 M 并不保存 G 的上下文信息,而是 G 自己保存了相关信息,这样有利于转移到其他 M 上,在不同的 M 上运行。

GPM模型
GPM模型

GPM 模型的优势点在于 G 包含了执行任务相关信息,M 提供了执行环境,并且有调度机制。而 P 则是他们两者的粘合剂。

假如没有 P 。那么 M 就会有争夺 G 的竞争问题,并且 M 的数量会不可控,会出现过多的 M 去处理 G。

一旦超过了 CPU 的核心数,那么就会将性能耗费在上下文切换过程中。

有了 P 这一层后,M 优先从 P 的本地队列获取 goroutine,减少并发竞争。并且保证了最多跟 CPU 核心数一样的 goroutine 数量在并行运行,充分利用了多核优势,又不被滥用。

总结

相信看过本文后,各位对 Golang 的调度有了一定的了解。正是因为基于协作的抢占式调度和 GMP 模型,Golang 的高并发高性能才有了底层保障。当然,大伙也可以深入到源码去分析这些调度机制,这样离大神就更近一步了 ㋡...


感兴趣的朋友可以搜一搜公众号「 阅新技术 」,关注更多的推送文章。

可以的话,就顺便点个赞、留个言、分享下,感谢各位支持!

阅新技术,阅读更多的新知识。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hugo + GitHub Pages 搭建自己的网站
很早之前,我使用 WordPress 搭建了个人博客:http://blog.studygolang.com,毕竟那时候 WordPress 是首选。现如今,大家似乎更喜欢静态博客,各种语言的静态博客生成器轮子不断,比如 Go 语言的 Hugo 就是一个静态博客生成器。我个人认为,静态博客生成器流行的一个很大原因,是 Markdown 的流行,开发人员习惯了使用 Markdown 进行写作。
lucifer210
2020/12/15
1.6K0
Hugo + GitHub Pages 搭建自己的网站
github pages/hexo搭建精致博客
进入一个文件夹(你想把工程放到哪个文件夹就进入哪个文件夹,我的是 ),初始化一个工程
神葳
2021/01/22
4440
怎样使用GitHub Pages搭建个人博客
创建一个名为 USERNAME.github.io 的仓库,其中 USERNAME 为你的 GitHub 用户名。
DevOps持续交付
2019/11/12
1.5K0
利用 GitHub Pages 快速搭建个人博客前言快速开始写文章自定义域名进阶利用GithHub Desktop管理GitHub仓库修改个人介绍常见问题其他Star补充最后要说个事情
前言 从 Jekyll 到 GitHub Pages 中间踩了许多坑,终于把我的个人博客BY Blog搭建出来了。。。 本教程针对的是不懂技术又想搭建个人博客的小白,操作简单暴力且快速。当然懂技术那就
BY
2018/05/11
4.2K1
搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门
喜欢写Blog的人,会经历三个阶段。   第一阶段,刚接触Blog,觉得很新鲜,试着选择一个免费空间来写。   第二阶段,发现免费空间限制太多,就自己购买域名和空间,搭建独立博客。   第三阶段
ruanyf
2018/04/13
1.9K0
搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门
使用hexo和码云pages搭建个人博客
GitHub上面的博客就无法用了,所以使用Hexo和码云pages搭建个人博客这个方案进入了我的视线…
全栈程序员站长
2021/04/07
5720
更换GitHub Pages博客主题
2.免费的主题通常都是GitHub的开源项目,访问GitHub项目主页
编程随想曲
2022/04/21
1.5K0
个人博客建设——Hexo的_config.yml配置参数注释
我的CN華少博客建设也有一段时间了,这段时间想去更新一下文章,突然发现原来的源码被我不知道弄到哪里去了,于是乎我又准备重新建一个项目,并在其基础上更换一套新的模板,并与Typore中的.md文件进行使用尝试,近期这几篇可能就是这个系列来进行了。 另之前开设的SSO统一身份认证近期没有再进行更新,后续会对其进行补充,请大家持续关注。
cn華少
2021/11/24
6500
基于Jekyll与Github Pages搭建博客
有搭建博客这个想法的原因是看到室友搭的博客,感觉很不错,暑假了也得搞点事情,于是就参考了室友的博客,查了不少教程学着自己也搭一个。
ttony0
2022/12/26
1.4K0
基于Jekyll与Github Pages搭建博客
Understand folder and path configuration in Jekyll
在使用 Jekyll 构建静态网站时,了解如何配置文件夹和路径对于网站的组织和内容管理至关重要。Jekyll 是一个功能强大的静态网站生成器,具有独特的文件夹结构和处理规则。本文将介绍 Jekyll 如何处理不同的文件夹,以及如何通过配置使网站更灵活。
alanzeng
2025/01/14
1750
GitHub Pages + Hexo - 搭建博客
npm install -g hexo-cli 4. 初始化框架 hexo init blog blog 是装博客的文件夹 5. 进入 blog 文件夹 cd blog 6. 执行 npm install 7. 执行 hexo server 或者 hexo s 成功的话,能在 http://localhost:4000, 能看到下图页面
赤蓝紫
2023/01/01
5650
GitHub Pages + Hexo - 搭建博客
玩转Github:使用GitHub Pages打造你的专属技术博客
那就有同学问了:作为一个后端开发者,前端的内容比较薄弱,怎样做的又好看,又方便呢?还有,习惯本地软件写文章,最好能不花钱卖服务器……
花花Binki
2023/11/16
5860
玩转Github:使用GitHub Pages打造你的专属技术博客
用Github搭建个人博客
上个月26号下午开始,原先博客的服务器宕机了,虽然一直觉得过段时间就会好的,不过一连3天都没恢复,开始有点忍不住了,内容还是好多的,没了多可惜啊,在公司登录不了管理后台,想从数据库把内容搞出来也做不到,如果是文件就好了,哭~~。虽然一直以来对Git1还停留在使用图形界面软件的程度,但还是想试试用GitHub2怎么折腾出一个博客出来。
GhostZhang
2022/08/22
8670
简单搭建自己的博客
本文主要讲如何使用 Jekyll 在 Github 搭建博客,其实我们还可以在国内网站搭建,本文是记下我从不知道 github 搭建博客,到成功搭建了博客遇到的问题 我在github建立了博客,博客地址:lindexi.github.io 使用技术得到 ddatsh.com 的支持,对他表示衷心感谢 搭建一个博客需要的技术很少,不需要在电脑安装什么,直接Clone一个主题,然后修改个人信息,放入博客就好。
林德熙
2022/08/12
5530
简单搭建自己的博客
利用 GitHub 从零开始搭建一个博客
趁着周末,搭建了一下 NightTeam 的官方博客和官方主页,耗时数个小时,两个站点终于完工了。这里写一篇文章顺手记录了下来。不过这篇原创我发在了 NightTeam 上面了,这边我就作为转载了。
崔庆才
2019/09/30
1K0
利用 GitHub 从零开始搭建一个博客
Hugo系列(4) - 从Hexo迁移至Hugo以及使用LoveIt主题的踩坑记录
本文主要记录从Hexo迁移至Hugo所遇到的一些坑,以及Hugo的LoveIt主题的一些bug之类的应对方案。下面是涉及到的Hexo、Hugo以及LoveIt各自的版本:
雨临Lewis
2022/01/12
1.7K0
Hexo -2- 站点信息配置
include and exclude options only apply to the source/ folder, whereas ignore option applies to all folders.
为为为什么
2022/08/04
6400
Hexo -2- 站点信息配置
建站神器:Hexo+Kaze+Gitee Pages 搭建静态博客网站
建网站本身是一个很大的工程,涉及前端页面的搭建,网站数据的存储,还要购置服务器资源,甚至是后期的维护,过程相当繁琐。
蜗牛互联网
2021/02/26
1.5K0
建站神器:Hexo+Kaze+Gitee Pages 搭建静态博客网站
可能是最全面的github pages搭建个人博客教程
先看下博客整体效果。在线预览我的博客https://lemonchann.github.io/
Bug开发工程师
2020/03/31
15.3K0
可能是最全面的github pages搭建个人博客教程
【Hexo】使用Hexo+github pages+travis ci 实现自动化部署
本系列文章将会详细说明使用 Hexo + github pages 来搭建个人博客,并对主题进行配置,然后使用 travis ci 来进行自动化部署的全过程。
弗兰克的猫
2020/05/09
8920
【Hexo】使用Hexo+github pages+travis ci 实现自动化部署
推荐阅读
相关推荐
Hugo + GitHub Pages 搭建自己的网站
更多 >
交个朋友
加入AI工作实战群
学习大模型落地案例 实操行业场景应用
加入腾讯云技术交流站
洞悉AI新动向 Get大咖技术交流群
加入AI学习入门群
AI入门避坑攻略 共享大咖学习笔记
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档