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工作时候,向目标线程发送信号

协程太多

处理方案

相关推荐
钟智强1 小时前
红队实战复盘:如何运用【火尖枪】高效突破复杂登录防线
服务器·安全·web安全·http·go·php·bruteforce
Grassto2 小时前
Go Module 基础概念全解析:module、version、sum 是什么
golang·go·go module
码luffyliu14 小时前
从 2 小时价格轮询任务通知丢失,拆解 Go Context 生命周期管控核心
后端·golang·go
踏浪无痕1 天前
一个 Java 老兵转 Go 后,终于理解了“简单”的力量
后端·程序员·go
代码扳手1 天前
一次线上事故后的反思:Go 项目中如何构建可靠的单元测试
后端·go
Penge6661 天前
Go JSON 序列化大整数丢失精度分析
后端·go
ServBay2 天前
掌握这9个GO技巧,代码高效又高能
后端·go
Grassto2 天前
一个 import 语句,引发的 Go 第三方包加载之旅
golang·go·go module
岁月的眸3 天前
【科大讯飞声纹识别和语音内容识别的实时接口实现】
人工智能·go·语音识别