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

协程太多

处理方案

相关推荐
探索云原生8 分钟前
KServe 工作流程:从 InferenceService 到 vLLM 服务
docker·ai·云原生·kubernetes·go
人人都是软件工程师1 小时前
13-错误处理:把失败变成可读、可判断的结果
go
林壮Allen18 小时前
用 Go 从零实现多 Agent 协作框架:两个让我踩坑的设计问题
go·ai编程
代码方舟1 天前
Go数据工程:利用天远柠檬查出险优化二手车批发拍卖车源出险核查合规体验
人工智能·go
不是万能的豆学长1 天前
排查Go服务40天后的内存泄漏问题
开发语言·后端·golang·go
用户125758524361 天前
Golang后台管理框架推荐:XYGo Admin与devinggo怎么选?
后端·go·ai编程
tachibana21 天前
Go语言里slice是怎么扩容的?
后端·golang·go·切片
tachibana22 天前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
newerp2 天前
GC Pacer 调优算法:GOGC、GOMEMLIMIT 与容器 OOM 防御
后端·程序员·go
newerp2 天前
逃逸分析、栈分配与 sync.Pool 对象池
后端·程序员·go