go语言-协程

mOS结构体 每一种操作系统不同的线程信息

g给g0栈给g0协程内存中分配的地址,记录函数跳转信息,

单线程循环 0.x版本

1.0版本 多线程循环

操作系统并不知道Goroutine的存在

操作系统线程执行一个调度循环,顺序执行Goroutine

调度循环非常像线程池

G-M-P调度模型

本地队列抓取资源,避免锁冲突

P是本地队列,m是服务的线程

head是头 tail是尾部 runq 协程结构体数据

下一个可用结构体

协程饥饿问题

切换时机

主动挂起gopark

mcall切换栈

系统调用完成时

抢占式调度

调用其他方法之前,编译器都要插入一个runtime.morestack(),基于协作主动调度

morestack的本意是检查协程栈是否有足够空间

系统监控Goruntime运行超过10s 将g.stackguard0置为0xfffffade

执行morestack0时判断是否被抢占如果被抢占,回到schedule0

基于信号的抢占式调度

操作系统中,有很多基于信号的底层通信方式

比如 SIGPIPE / SIGURG / SIGHUP

线程可以注册对应信号的处理函数

注册SIGURG信号的处理函数 紧急信号

GC工作时候,向目标线程发送信号

协程太多

处理方案

相关推荐
Mgx7 小时前
深入理解 Windows 全局键盘钩子(Hook):拦截 Win 键的 Go 实现
go
王中阳Go7 小时前
又整理了一场真实Golang面试复盘!全是高频坑+加分话术,面试遇到直接抄
后端·面试·go
itarttop9 小时前
Go Error 全方位解析:原理、实践、扩展与封装
go
itarttop9 小时前
Go Channel 深度指南:规范、避坑与开源实践
go
不爱笑的良田21 小时前
从零开始的云原生之旅(十一):压测实战:验证弹性伸缩效果
云原生·容器·kubernetes·go·压力测试·k6
Java陈序员2 天前
代码检测器!一款专门揭露屎山代码的质量分析工具!
docker·go
豆浆Whisky2 天前
Go编译器优化秘籍:性能提升的黄金参数详解|Go语言进阶(16)
后端·go
不爱笑的良田2 天前
从零开始的云原生之旅(九):云原生的核心优势:自动弹性伸缩实战
云原生·容器·kubernetes·go
无限中终3 天前
ENERGY Designer:重构跨平台GUI开发的高效解决方案
重构·go·结对编程
shining3 天前
[Golang] 万字详解,深入剖析context
go