【九月打卡】第14天 go的协程-协程的抢占式调度
2022/9/19 3:17:16
本文主要是介绍【九月打卡】第14天 go的协程-协程的抢占式调度,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
课程名称:深入Go底层原理,重写Redis中间件实战
课程章节:5-7,5-8
课程讲师:Moody
课程内容:
协程虽然可以被gopark和系统调用完成时这样的操作挂起,但是如果没有这两个操作,协程依然无法被挂起。这就需要一个机制来主动挂起协程。
通过go build -gcflags -S main.go 来看,系统在进行方法调用的时候,执行了runtime.morestack方法。
morestack方法本意是用来在方法调用的时候检查栈是否有足够的空间。
go在这个经常被调用的方法里面做了钩子,系统监控到goroutine运行超过10毫秒,就认为这个是个大协程,因此就会进行标记抢占。
※ 标记抢占
系统监控协程运行超过10ms
将g.stackguard0 设置为0xfffffade (抢占标志)
执行morestack()时判断是否已经被标记抢占
如果被抢占,直接回到schedule()
※ 基于信号抢占
如果方法并没有涉及到函数调用,那么就永远不会去检查morestack,那么也不会去检查标记位置,最后实现调度。
那么就可以实现一个基于信号的抢占。
操作系统底层中有很多基于信号的通信方式
线程可以注册对应信号的处理函数
注册信号SIGURG 紧急信号的处理函数,该信号用的地方非常少,基本不会发生冲突
GC工作的时候,向目标线程发送信号,因为GC的时候很多工作都停了,适合做抢占
线程收到信号的时候会触发调度
doSigPreempt方法会执行一个汇编方法,最终依然回调到mcall。
该流程主要是在GC里面下钩子,GC每过一段时间必然会进行垃圾回收,正是这个时刻,向线程发起调度信号,从而完成协程调度
课程收获:
这节课基本解释了协程的被动调用方式,明白了这个原理后,就知道为什么协程会比线程快很多,因为协程本身在切换的时候基本不耗费硬件的资源,完全是依赖线程本身的一些功能进行调度
这篇关于【九月打卡】第14天 go的协程-协程的抢占式调度的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站