当前位置:网站首页>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怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。
边栏推荐
猜你喜欢

【报错】Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘concat‘)
OnePlus 10RT appears on Geekbench, product launch also seems to be approaching

Xingtu has been short of disruptive products?Will this M38T from the Qingdao factory be a breakthrough?

不需要写代码,快速批量修改文件夹中图片的格式

数字化采购管理系统开发:精细化采购业务流程管理,赋能企业实现“阳光采购”

面经汇总-社招-6年

基于ORB-SLAM2的改进代码

B001 - 基于STM32的智能生态鱼缸

MySQL Lock wait timeout exceeded; try restarting transaction 锁等待

hcip第九天
随机推荐
顺序表的简单描述及代码的简单实现
直播系统聊天技术(八):vivo直播系统中IM消息模块的架构实践
云商店携手快报税,解锁财务服务新体验!
QT commonly used global macro definitions
opencv real-time face detection
[供应链·案例篇]石油和天然气行业的数字化转型用例
The anxiety of the post-90s was cured by the vegetable market
三维空间中点的插值
opencv语法Mat类型总结
关于MySql中explain结果filtered的理解
QT basic functions, signals, slots
SQL的索引详细介绍
Basic image processing in opencv
CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!) Solution
OnePlus 10RT appears on Geekbench, product launch also seems to be approaching
小贝拉机器人是朋友_普渡科技召开新品发布会,新一代送餐机器人“贝拉”温暖登场...
数字化采购管理系统开发:精细化采购业务流程管理,赋能企业实现“阳光采购”
Are online account opening commissions reliable? Is online account opening safe?
QT_QThread线程
云原生全景图详解