当前位置:网站首页>Golang协程调度器scheduler怎么使用
Golang协程调度器scheduler怎么使用
2022-08-01 17:56:00 【亿速云】
Golang协程调度器scheduler怎么使用
这篇文章主要介绍“Golang协程调度器scheduler怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang协程调度器scheduler怎么使用”文章能帮助大家解决问题。
1. 调度器scheduler的作用
我们都知道,在Go语言中,程序运行的最小单元是gorouines。
然而程序的运行最终都是要交给操作系统来执行的,以Java为例,Java中的一个线程对应的就是操作系统中的线程,以此来实现在操作系统中的运行。在Go中,gorouines比线程更轻量级,其与操作系统的线程也不是一一对应的关系,然而,最终我们想要执行程序,还是要借助操作系统的线程来完成,调度器scheduler的工作就是完成gorouines到操作系统线程的调度。
2. GMP模型
当我们运行go fun(){}
时,会生成一个g,优先放置在创建他的p的本地队列中,如果本地队列已满,那么会放置在全局队列中。
g的运行需要借助p与m,p是执行器,只有获得p的g才能执行,p的执行需要挂在m上,m对应的是操作系统中的线程,p的数量与CPU的核数相同。
goroutine运行所需要的上下文信息都是存放在g的数据结构当中的,所以g可以依靠任意的p或者m执行,而对于操作系统而言,其并不能看到p与g的调度过程,这些过程对于操作系统线程来说都是连续的,所以省去了线程上下文切换的开销。
g的数据结构如下所示:
type g struct { stack stack // g自己的栈 m *m // 执行当前g的m sched gobuf // 保存了g的现场,goroutine切换时通过它来恢复 atomicstatus uint32 // g的状态Gidle,Grunnable,Grunning,Gsyscall,Gwaiting,Gdead goid int64 schedlink guintptr // 下一个g, g链表 preempt bool //抢占标记 lockedm muintptr // 锁定的M,g中断恢复指定M执行 gopc uintptr // 创建该goroutine的指令地址 startpc uintptr // goroutine 函数的指令地址}
p的数据结构如下所示:
type p struct { id int32 status uint32 // 状态 link puintptr // 下一个P, P链表 m muintptr // 拥有这个P的M mcache *mcache // P本地runnable状态的G队列 runqhead uint32 runqtail uint32 runq [256]guintptr runnext guintptr // 一个比runq优先级更高的runnable G // 状态为dead的G链表,在获取G时会从这里面获取 gFree struct { gList n int32 } gcBgMarkWorker guintptr // (atomic) gcw gcWork}
m的数据结构如下所示:
type m struct { g0 *g // g0, 每个M都有自己独有的g0 curg *g // 当前正在运行的g p puintptr // 当前用于的p nextp puintptr // 当m被唤醒时,首先拥有这个p id int64 spinning bool // 是否处于自旋 park note alllink *m // on allm schedlink muintptr // 下一个m, m链表 mcache *mcache // 内存分配 lockedg guintptr // 和 G 的lockedm对应 freelink *m // on sched.freem}
通过gmp模型,我们能解决gorouines到操作系统线程的映射问题,gorouines之间的切换是在用户态完成的,在操作系统的视角来看,线程的上下文切换并不频繁,因此就少了很多陷入内核的过程,所以有更好的并发效果。
3. 调度机制
1)work stealing机制
当一个p上的g执行完之后,他会尝试从其他的p队列中窃取g来执行,以减少操作系统线程的切换动作。
2)hand off机制
这个是针对m来说的,有的时候m可能因为g的信号调用而被操作系统阻塞,这个时候p就会挂载去另一个m继续执行可以执行的g,当阻塞的m就绪之后,会给p发信号,召唤他回来继续进行后续操作。
关于“Golang协程调度器scheduler怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。
边栏推荐
- 晶振工作原理详解
- SRM供应商管理系统如何助力口腔护理企业实现采购战略的转型升级
- ROS2系列知识(5):【参数】如何管理?
- 关于MySql中explain结果filtered的理解
- 存储日报-数据湖架构权威指南(使用 Iceberg 和 MinIO)
- 不需要写代码,快速批量修改文件夹中图片的格式
- OnePlus 10RT appears on Geekbench, product launch also seems to be approaching
- Leetcode74. 搜索二维矩阵
- SQL的substring_index()用法——MySQL字符串截取
- 数字化采购管理系统开发:精细化采购业务流程管理,赋能企业实现“阳光采购”
猜你喜欢
面经汇总-社招-6年
B011 - 51-based multifunctional fingerprint smart lock
[供应链·案例篇]石油和天然气行业的数字化转型用例
实现mnist手写数字识别
【Error】Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘concat’)
DBPack SQL Tracing 功能及数据加密功能详解
B011 - 基于51的多功能指纹智能锁
2022年SQL大厂高频实战面试题(详细解析)
机器学习快速入门
成为优秀架构师必备技能:怎样才能画出让所有人赞不绝口的系统架构图?秘诀是什么?快来打开这篇文章看看吧!...
随机推荐
B005 – 基于STC8的单片机智能路灯控制系统
史上最全的Redis基础+进阶项目实战总结笔记
golang json 返回空值
今年最火爆的词:商业分析,看这一篇就够了!
ROS2系列知识(7):用rqt_console查看日志logs
吴恩达机器学习课后习题——kmeans
md5sum源码 可多平台编译
小贝拉机器人是朋友_普渡科技召开新品发布会,新一代送餐机器人“贝拉”温暖登场...
千万级乘客排队系统重构&压测方案总结篇
MySQL 45 讲 | 09 普通索引和唯一索引,应该怎么选择?
插入排序 优化插入排序
C语言理论--笔试面试基础稳固
BITS Pilani|SAC-AP:基于 Soft Actor Critic 的深度强化学习用于警报优先级
极化微波成像概述
统信软件、龙芯中科等四家企业共同发布《数字办公安全创新方案》
QT_事件类
B011 - 基于51的多功能指纹智能锁
2022年MySQL最新面试题
云原生全景图详解
素域和扩域